2014-05-02 48 views
2

當所選策略爲GenerationType.TABLE時,我需要覆蓋從Hibernate爲實體生成的值。如何覆蓋策略GenerationType.TABLE的Hibernate Id生成

需要重寫生成值的一個示例是,當id字段的值已由應用程序的某個其他層提供時,我不希望Hibernate生成新值,而是使用提供的值。

這裏是實體的ID部分(Adventity公司)

@TableGenerator(name = "AID_SERIAL", 
       table = "serial", 
       pkColumnName="name", pkColumnValue = "adv", 
       valueColumnName = "no", allocationSize = 1) 
@GeneratedValue(strategy= GenerationType.TABLE, generator="AID_SERIAL") 
@Column(name = "AID") 
@Id 
public Integer getAid() { 
    return aid; 
} 

我已經發現了描述在使用GenerationType.SEQUENCE如何解決這個問題很多答案,但找不到任何爲GenerationType.TABLE

回答

2

在Hibernate中通過代碼要與調試後,我想出了下面的代碼,解決我的問題:

@GenericGenerator(name = "AID_SERIAL", strategy = "my.package.structure.AdvAidValueGenerator", 
        parameters = { 
            @Parameter(name="table", value="serial"), 
            @Parameter(name="primary_key_column", value="name"), 
            @Parameter(name="max_lo", value="0"), 
            @Parameter(name="table", value="serial"), 
            @Parameter(name="value_column", value="no"), 
            @Parameter(name="primary_key_value", value="adv") 
        }) 
@GeneratedValue(generator="AID_SERIAL") 
@Column(name = "AID") 
@Id 
public Integer getAid() { 


    return aid; 
} 



public class AdvAidValueGenerator extends MultipleHiLoPerTableGenerator { 

     @Override 
     public Serializable generate(SessionImplementor session, Object object) throws HibernateException { 
      if(!(object instanceof AdvEntity)) { 
       throw new IllegalArgumentException("AdvAidValueGenerator should only be used for AdvEntity"); 
      } 

      final AdvEntity advEntity = (AdvEntity) object; 
      final Integer presentAid = advEntity.getAid(); 
      if(null == presentAid) { 
       return super.generate(session, object); 
      } 
      return presentAid; 
     } 
} 

不Ë這種策略Hibernate的具體,不會對其他廠商的JPA

我還要補充一點,我使用Hibernate 4.3.1版本

+0

我回答我的問題是被允許(HTTP工作://元。 stackexchange.com/questions/12513/should-i-not-answer-my-own-questions),以幫助未來的讀者可能有同樣的問題 – geoand