沉睡森林@漂在北京

          本處文章除注明“轉(zhuǎn)載”外均為原創(chuàng),轉(zhuǎn)載請注明出處。

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            152 隨筆 :: 4 文章 :: 114 評(píng)論 :: 0 Trackbacks
          自定義主鍵生成策略,由@GenericGenerator實(shí)現(xiàn)。
          hibernate在JPA的基礎(chǔ)上進(jìn)行了擴(kuò)展,可以用一下方式引入hibernate獨(dú)有的主鍵生成策略,就是通過@GenericGenerator加入的。

          比如說,JPA標(biāo)準(zhǔn)用法
          Java代碼
          @Id  
          @GeneratedValue(GenerationType.AUTO)  

          就可以用hibernate特有以下用法來實(shí)現(xiàn)
          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指定的具體生成器所用到的參數(shù)。

          對(duì)于這些hibernate主鍵生成策略和各自的具體生成器之間的關(guān)系,在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一共默認(rèn)支持十三種生成策略。

          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 報(bào)錯(cuò)(?)
          Java代碼
          @OneToOne(cascade = CascadeType.ALL)   
          @PrimaryKeyJoinColumn   
          例如
          Java代碼
          @Entity  
          public class Employee {   
            @Id Integer id;   
                 
            @OneToOne @PrimaryKeyJoinColumn  
             EmployeeInfo info;   
                
          }  
          應(yīng)該為
          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自定義主鍵生成策略
          如果實(shí)際應(yīng)用中,主鍵策略為程序指定了就用程序指定的主鍵(assigned),沒有指定就從sequence中取。
          明顯上面所討論的策略都不滿足,只好自己擴(kuò)展了,集成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;   
          }   
          }  

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


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

          只有注冊用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 万盛区| 哈尔滨市| 安宁市| 宜春市| 蓬安县| 兖州市| 逊克县| 南木林县| 奉贤区| 恩平市| 府谷县| 安庆市| 黎平县| 苗栗县| 石柱| 行唐县| 长春市| 潍坊市| 湘阴县| 阳谷县| 昌邑市| 延吉市| 肇源县| 南宫市| 台中县| 错那县| 孟连| 德钦县| 兴安县| 塔河县| 马边| 焦作市| 和林格尔县| 呼和浩特市| 和顺县| 常德市| 石家庄市| 桑植县| 图木舒克市| 怀来县| 揭东县|