<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    沉睡森林@漂在北京

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

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

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


    網站導航:
     
    主站蜘蛛池模板: 又黄又爽的视频免费看| 免费高清小黄站在线观看| 亚洲精品卡2卡3卡4卡5卡区| 久草免费福利资源站| 大学生美女毛片免费视频| 亚洲国产精品成人久久久| 久久经典免费视频| 日韩亚洲人成在线| 国产无遮挡裸体免费视频 | 美女被免费网站91色| 色久悠悠婷婷综合在线亚洲| 最新久久免费视频| 亚洲一区二区成人| 亚洲αⅴ无码乱码在线观看性色| 女人张开腿等男人桶免费视频| 亚洲日韩一区精品射精| 久久免费区一区二区三波多野| 亚洲一区二区成人| 四虎在线免费播放| 免费视频成人国产精品网站 | 1000部免费啪啪十八未年禁止观看 | 久久精品国产精品亚洲下载| 日本高清不卡aⅴ免费网站| 免费大学生国产在线观看p| 人妻18毛片a级毛片免费看| 国产日韩亚洲大尺度高清| 国产91色综合久久免费分享| 亚洲综合无码无在线观看| 亚洲黄片毛片在线观看| 日韩精品免费在线视频| 亚洲色欲色欲www| 亚洲VA综合VA国产产VA中| 亚洲视频在线免费观看| 亚洲日本中文字幕天天更新| 亚洲视频在线一区二区| 亚洲一区免费在线观看| 美女裸免费观看网站| 亚洲精品高清久久| 国产成人免费ā片在线观看| 无码少妇精品一区二区免费动态| 亚洲 暴爽 AV人人爽日日碰|