2015-05-12 20 views
0

我的場景很簡單。我在@Entity類的entityID標識字段和DB(甲骨文,這我不知道的事項):如何在持續使用之前使用生成的序列號?

@Id 
@SequenceGenerator(name="ENTITY_SEQ_GEN", sequenceName="SEQ_GENERIC", allocationSize = 1) 
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="ENTITY_SEQ_GEN") 
@Column(name="ENTITY_ID") 
private long entityID; 

我有另一個叫場,讓我們說,entityReadableID這應該是由一個String字符串化的實體ID與實體中的另一個字符串字段連接起來。例如。如果entityID是,entityReadableID可能類似於1234ABC

我的問題是,據我所知,在數據庫中創建行之前entityID的值是未知的,但我需要使用它的值連接entityReadableID。有沒有辦法在數據庫中創建行之前獲取序列生成ID的值,以便我可以使用它來生成其他ID?我知道我可以使它成爲一個插入字段爲空,然後進行更新,一旦我知道什麼entityID是,但該解決方案似乎不夠優雅。

我期望Hibernate/Oracle可能支持這種方式的方式是,如果Hibernate可以以某種方式爲實際持久化之前正在處理的實體「保留/發出」下一個生成的值,讓我知道它是什麼,所以我可以操縱它,然後最後堅持它。

+1

爲什麼你有這個領域的第一個地方?這是多餘的,因爲它是兩個其他字段串聯的結果。 –

+0

,因爲它需要默認生成,顯示在用戶界面中,那麼用戶可以更改它(如果他選擇的話) – amphibient

+1

然後恐怕您必須堅持(並刷新)沒有此字段的實體,並且然後計算它。 –

回答

0

您可以通過不直接使用序列,用於實體堅持該實體之前拿到生成的ID,我的意思是使用一個分離的實體爲順序,所以你的實體應該是這樣的:

@Entity 
@Table(name = "ENTITY" 
) 
public class EntityClass implements java.io.Serializable { 

    private Long entityId; 
    private String entityRelatedId; 

    public EntityClass() { 
    } 
    // you may have other constructors 

    @Id 
    @Column(name = "ENTITY_ID", nullable = false) 
    public Long getEntityId() { 
     return this.entityId; 
    } 

    public void setEntityId(Long entityId) { 
     this.entityId = entityId; 
    } 

    @Column(name = "ENTITY_RELATED_ID", length = 50) 
    public String getEntityRelatedId() { 
     return this.entityRelatedId; 
    } 

    public void setEntityRelatedId(String entityRelatedId) { 
     this.entityRelatedId = entityRelatedId; 
    } 

} 

和爲序列的實體是一樣的東西:

@Entity 
@Table(name = "SEQ_GENERIC_TBL" 
) 
public class SeqGenericTbl implements java.io.Serializable { 

    private Long id; 

    public SeqGenericTbl() { 
    } 

    public SeqGenericTbl(Long id) { 
     this.id = id; 
    } 

    @Id 
    @SequenceGenerator(name = "ENTITY_SEQ_GEN", 
      sequenceName = "SEQ_GENERIC", allocationSize = 1) 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "ENTITY_SEQ_GEN") 
    @Column(name = "ID") 
    public Long getId() { 
     return this.id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

} 

現在你可以從序列的實體獲得ID(堅持它,你可以回滾TRAN或刪除或更新版本清空相關表):

SessionFactory sf = HBUtil.getSessionFactory(); 
    Session s = sf.openSession(); 
    SeqGenericTbl sg=new SeqGenericTbl(); 
    s.save(sg); 

    EntityClass entity1 = new EntityClass(); 
    entity1.setEntityId(sg.getId()); 
    //NOW YOU HAVE THE ID WITHOUT PERSISTING THE ENTITY 
    System.out.println(entity1.getEntityId()); 
相關問題