2015-05-12 50 views
2

通常ID列如下所示,運行完美,生成的序列值如何覆蓋@SequenceGenerator(NAME = 「idGenerator」,sequenceName = 「HIBERNATE_SEQUENCE」,allocationSize = 50)

@Id 
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "idGenerator") 
@SequenceGenerator(name = "idGenerator", sequenceName = "HIBERNATE_SEQUENCE", allocationSize = 50) 
@Column(name = "ID") 
public Long getId() 
{ return mId; } 

現在我想要的是,如果在程序中我設置了xyz.setId(200),它應該將Id保存爲200,而不是序列生成的一個。現在該如何實現?我也想同時使用sequenceName =「HIBERNATE_SEQUENCE」,allocationSize = 50.

+0

爲什麼? ID值應該沒有意義。 –

回答

0

這是一個棘手的問題。一般來說,ID是在事務提交時生成的。這是JPA persist()不返回數據庫PK的原因之一。

我想你可以在@PostPersist監聽器中更改對象的ID,如果有手動ID。如果您想在此之後使用該對象,則必須提交該更改並重新讀取該對象以使其進入一致狀態。

規格參考: 「3.2.4同步到數據庫:持久化實體的狀態在事務被同步到數據庫提交此同步涉及任何更新寫入數據庫持久實體...... 包括分配對持久化屬性或字段的新值...應用程序可以使用刷新方法強制同步。「

+0

但在@PostPersist中,我將如何更新ID,因爲Spring Jpa只會通過ID進行搜索,然後如何在PostPersist中啓動一個新的事務?可以舉例 –

2

最後經過一天的使用時間,我挖掘到罐子裏,並得到了解決方案。 我用@GenericGenerator(name = "idGenerator", strategy = "com.jayash.domain.UseExistingOrGenerateIdGenerator")

public class UseExistingOrGenerateIdGenerator extends SequenceHiLoGenerator { 
    @Override 
    public Serializable generate(SessionImplementor session, Object object) throws HibernateException { 
     Serializable id = session.getEntityPersister(null, object).getClassMetadata().getIdentifier(object, session); 
     return id != null ? id : super.generate(session, object); 
    } 

    @Override 
    public void configure(Type type, Properties params, Dialect dialect) throws MappingException { 

     params.put(org.hibernate.id.SequenceGenerator.SEQUENCE, "HIBERNATE_SEQUENCE"); 


     params.put(SequenceHiLoGenerator.MAX_LO, String.valueOf("49")); 

     super.configure(type, params, dialect); 
    } 

} 

而且Yipee它的工作的偉大