沉睡森林@漂在北京

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

            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 王總兵 閱讀(654) 評論(0)  編輯  收藏

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


          網站導航:
           
          主站蜘蛛池模板: 扬中市| 南丹县| 嘉禾县| 甘南县| 托克逊县| 青海省| 开封县| 稻城县| 斗六市| 岳西县| 安陆市| 万盛区| 靖西县| 新巴尔虎左旗| 织金县| 博客| 子洲县| 柯坪县| 久治县| 石河子市| 崇信县| 河池市| 濮阳县| 和顺县| 拜城县| 沁阳市| 固阳县| 大方县| 清流县| 普兰县| 仁怀市| 兴安盟| 丁青县| 石狮市| 横山县| 柏乡县| 吉水县| 会同县| 班戈县| 尼勒克县| 福建省|