2014-10-29 74 views
3

我正在使用jpa 2.0,並且我有一個默認情況下具有值的數據庫表中的字段,我將該字段放在我的實體定義中作爲insertable = false,以便在插入時保留默認值時,插入將正確完成,但在重新查詢實體中該字段爲空的對象時,它會正確插入。jpa2強制em來刷新設置爲insertable = false的字段

這是我的代碼:

@Entity 
@Table(name="SOME_TABLE") 
public class SomeTable implements Serializable { 
private static final long serialVersionUID = 1L; 

@EmbeddedId 
private SomeTablePK id; 

@Column(name="X1") 
private String x1; 

**@Column(name="X2", insertable=false)** 
private Date x2; 

... more fields.... 

... setters and getters... 
} 

有什麼辦法來迫使實體管理器刷新,我作爲插入=假字段的值?或者我能做些什麼來解決它?

非常感謝。

PS。在我的persistence.xml中提及這一點很重要,並放置以下行來禁用緩存。

<properties> 
<property name="javax.persistence.sharedCache.mode" value="NONE"/> 
</properties> 

回答

3

您將需要在刷新操作後手動調用刷新。

的規格(3.2.4同步到數據庫)說:

持久化實體的狀態在事務同步到數據庫提交。這種同步包括向數據庫寫入對持久實體及其關係的任何更新,如上所述。

對實體狀態的更新包括向實體的持久性屬性或字段賦值新值,以及修改持久性屬性或字段的可變值[28]。

收費如下事項:

同步到數據庫中不涉及任何管理實體的刷新,除非刷新操作顯式調用這些實體或級聯,以它們作爲規範的結果級聯= REFRESH或cascade = ALL註釋元素值。

+0

感謝您的解釋,具有默認值的字段是一個沒有約束的字段,我在哪裏或如何放置註釋級聯= REFRESH? Thnx再次! – Mariah 2014-10-29 22:07:07

+0

註釋本身不起作用,您將需要調用'entityManager.refresh(YOU_ENTITY)'。級聯註釋僅適用於實體關係船。 – uaiHebert 2014-10-30 15:31:07

+0

再次感謝您的回覆,當我試圖刷新後,堅持實體說「EntityNotFoundException:實體不再存在」,我在一個EJB中使用jpa,我該如何解決這個問題? – Mariah 2014-10-30 16:21:46