沉睡森林@漂在北京

          本處文章除注明“轉載”外均為原創,轉載請注明出處。

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            152 隨筆 :: 4 文章 :: 114 評論 :: 0 Trackbacks
          自定義主鍵生成策略,由@GenericGenerator實現。
          hibernate在JPA的基礎上進行了擴展,可以用一下方式引入hibernate獨有的主鍵生成策略,就是通過@GenericGenerator加入的。

          比如說,JPA標準用法
          Java代碼
          @Id  
          @GeneratedValue(GenerationType.AUTO)  

          就可以用hibernate特有以下用法來實現
          Java代碼
          @GeneratedValue(generator = "paymentableGenerator")     
          @GenericGenerator(name = "paymentableGenerator", strategy = "assigned")  


          @GenericGenerator的定義:
          Java代碼
          @Target({PACKAGE, TYPE, METHOD, FIELD})   
          @Retention(RUNTIME)   
          public @interface GenericGenerator {   
            
          String name();   
            
          String strategy();   
            
          Parameter[] parameters() default {};   
          }  


          name屬性指定生成器名稱。
          strategy屬性指定具體生成器的類名。
          parameters得到strategy指定的具體生成器所用到的參數。

          對于這些hibernate主鍵生成策略和各自的具體生成器之間的關系,在org.hibernate.id.IdentifierGeneratorFactory中指定了,
          Java代碼
          static {   
             GENERATORS.put("uuid", UUIDHexGenerator.class);   
             GENERATORS.put("hilo", TableHiLoGenerator.class);   
             GENERATORS.put("assigned", Assigned.class);   
             GENERATORS.put("identity", IdentityGenerator.class);   
             GENERATORS.put("select", SelectGenerator.class);   
             GENERATORS.put("sequence", SequenceGenerator.class);   
             GENERATORS.put("seqhilo", SequenceHiLoGenerator.class);   
             GENERATORS.put("increment", IncrementGenerator.class);   
             GENERATORS.put("foreign", ForeignGenerator.class);   
             GENERATORS.put("guid", GUIDGenerator.class);   
             GENERATORS.put("uuid.hex", UUIDHexGenerator.class); //uuid.hex is deprecated   
             GENERATORS.put("sequence-identity", SequenceIdentityGenerator.class);   
          }  

          上面十二種策略,加上native,hibernate一共默認支持十三種生成策略。

          1、native
          Java代碼
          @GeneratedValue(generator = "paymentableGenerator")     
          @GenericGenerator(name = "paymentableGenerator", strategy = "native")   

          2、uuid
          Java代碼
          @GeneratedValue(generator = "paymentableGenerator")     
          @GenericGenerator(name = "paymentableGenerator", strategy = "uuid")   

          3、hilo
          Java代碼
          @GeneratedValue(generator = "paymentableGenerator")     
          @GenericGenerator(name = "paymentableGenerator", strategy = "hilo")   

          4、assigned
          Java代碼
          @GeneratedValue(generator = "paymentableGenerator")     
          @GenericGenerator(name = "paymentableGenerator", strategy = "assigned")   

          5、identity
          Java代碼
          @GeneratedValue(generator = "paymentableGenerator")     
          @GenericGenerator(name = "paymentableGenerator", strategy = "identity")   

          6、select
          Java代碼
          @GeneratedValue(generator = "paymentableGenerator")   
          @GenericGenerator(name="select", strategy="select",   
                parameters = { @Parameter(name = "key", value = "idstoerung") })  

          7、sequence
          Java代碼
          @GeneratedValue(generator = "paymentableGenerator")   
          @GenericGenerator(name = "paymentableGenerator", strategy = "sequence",   
                    parameters = { @Parameter(name = "sequence", value = "seq_payablemoney") })  

          8、seqhilo
          Java代碼
          @GeneratedValue(generator = "paymentableGenerator")   
          @GenericGenerator(name = "paymentableGenerator", strategy = "seqhilo",   
                    parameters = { @Parameter(name = "max_lo", value = "5") })  

          9、increment
          Java代碼
          @GeneratedValue(generator = "paymentableGenerator")     
          @GenericGenerator(name = "paymentableGenerator", strategy = "increment")   

          10、foreign
          Java代碼
          @GeneratedValue(generator = "idGenerator")   
          @GenericGenerator(name = "idGenerator", strategy = "foreign",   
                    parameters = { @Parameter(name = "property", value = "employee") })  


          注意:直接使用@PrimaryKeyJoinColumn 報錯(?)
          Java代碼
          @OneToOne(cascade = CascadeType.ALL)   
          @PrimaryKeyJoinColumn   
          例如
          Java代碼
          @Entity  
          public class Employee {   
            @Id Integer id;   
                 
            @OneToOne @PrimaryKeyJoinColumn  
             EmployeeInfo info;   
                
          }  
          應該為
          Java代碼
          @Entity  
          public class Employee {   
            @Id   
            @GeneratedValue(generator = "idGenerator")   
            @GenericGenerator(name = "idGenerator", strategy = "foreign",   
                    parameters = { @Parameter(name = "property", value = "info") })   
             Integer id;   
                 
            @OneToOne  
             EmployeeInfo info;   
                
          }  
          11、guid
          Java代碼
          @GeneratedValue(generator = "paymentableGenerator")     
          @GenericGenerator(name = "paymentableGenerator", strategy = "guid")   

          12、uuid.hex
          Java代碼
          @GeneratedValue(generator = "paymentableGenerator")     
          @GenericGenerator(name = "paymentableGenerator", strategy = "uuid.hex")   

          13、sequence-identity
          Java代碼
          @GeneratedValue(generator = "paymentableGenerator")   
          @GenericGenerator(name = "paymentableGenerator", strategy = "sequence-identity",   
                    parameters = { @Parameter(name = "sequence", value = "seq_payablemoney") })  

          四、通過@GenericGenerator自定義主鍵生成策略
          如果實際應用中,主鍵策略為程序指定了就用程序指定的主鍵(assigned),沒有指定就從sequence中取。
          明顯上面所討論的策略都不滿足,只好自己擴展了,集成assigned和sequence兩種策略。

          Java代碼
          public class AssignedSequenceGenerator extends SequenceGenerator implements   
          PersistentIdentifierGenerator, Configurable {   
          private String entityName;   
               
          public void configure(Type type, Properties params, Dialect dialect) throws MappingException {   
             entityName = params.getProperty(ENTITY_NAME);   
            if (entityName==null) {   
             throw new MappingException("no entity name");   
             }   
               
            super.configure(type, params, dialect);     
          }   
            
          public Serializable generate(SessionImplementor session, Object obj)   
            throws HibernateException {   
               
             Serializable id = session.getEntityPersister( entityName, obj )   
               .getIdentifier( obj, session.getEntityMode() );   
               
            if (id==null) {   
              id = super.generate(session, obj);   
             }   
               
            return id;   
          }   
          }  

          實際應用中,定義同sequence。
          Java代碼
          @GeneratedValue(generator = "paymentableGenerator")   
          @GenericGenerator(name = "paymentableGenerator", strategy = "AssignedSequenceGenerator",   
                parameters = { @Parameter(name = "sequence", value = "seq_payablemoney") })  


          值得注意的是,定義的這種策略,就像打開了潘多拉魔盒,非常不可控。正常情況下,不建議這么做。
          posted on 2010-03-15 21:50 王總兵 閱讀(650) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 婺源县| 汉源县| 吴旗县| 鹤壁市| 鸡西市| 忻州市| 固镇县| 金寨县| 深圳市| 永嘉县| 铁岭县| 平谷区| 汉源县| 兰考县| 富川| 富顺县| 封丘县| 中卫市| 武平县| 邯郸县| 会同县| 桂林市| 巴楚县| 辽源市| 郴州市| 泸定县| 紫阳县| 鲜城| 安新县| 榆树市| 襄垣县| 娱乐| 宁武县| 关岭| 清原| 岳阳市| 保靖县| 扎赉特旗| 阿图什市| 墨脱县| 睢宁县|