檢查 JPA 連鎖策略中的行為變更

此規則會標示利用連鎖策略 PERSIST、MERGE 或 ALL 來定義 JPA 實體與關係的 JPA 專案,讓您知道 WebSphere Application Server 8.5 版與 Liberty 中 JPA 2.0 實作的預設行為變更。 在 8.5 版之前,當連鎖一項持續保存時,會檢查資料庫來查看實體是否已存在。 新的預設行為是不首先檢查, 如果實體已在資料庫中,則會擲出 「實體金鑰已存在」持續性異常狀況。 這個行為變更的好處是避免額外存取資料庫,從而改進效能。

預計大部分應用程式都不受這個行為變更的影響。 如果要充分利用這個新行為,在進行程式碼變更或回復先前的行為之前,您可以先在 8.5 版環境中試試應用程式。

如果發生問題,或已知您的應用程式撰寫成預期持續保存作業會先在資料庫中尋找新實體,而不是處理新的可能的持續性異常狀況,您可以在 persistence.xml 中設定 openjpa.Compatibility 內容來回復先前的行為。

<persistence-unit name="name" transaction-type="JTA">
...
<properties>
<property name="openjpa.Compatibility" value="checkDatabaseForCascadePersistToDetachedEntity=true"/>
</properties>
</persistence-unit>

如果您不想變更應用程式,也可以將這個內容設為伺服器 JVM 系統內容。

這個潛在的應用程式問題有一個相關聯的 Java 規則和 XML 規則,有助於提升您的認知。 即使在多個位置定義了連鎖持續保存,每個專案也只會標示一個結果。 如此您便有機會針對這個問題來評估您的整個應用程式。

您尤其應該評估 EntityManager 作業 persistmerge 呼叫,以判斷程式碼是否會適當處理這項行為變更。 評估應用程式之後,您可以在分析配置中關閉此規則,或忽略產生的結果。

這個 Java 規則會標示關係註釋中所定義的任何下列連鎖策略:

例如,在 @OneToOne 之類的關係註釋中,會標示連鎖類型。

@Entity
public class Foo {
private Bar bar;

@OneToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
public Bar getBar() {
return bar;
}
}

這個 XML 規則會標示 orm.xml 檔中定義給實體的任何下列連鎖策略:

<entity class="com.ibm.entities.Foo" access="FIELD">
<attributes>
<one-to-one name="bar">
<cascade><cascade-persist/><cascade-merge/></cascade>
</one-to-one>
</attributes>
</entity>

如果您看到標示了任何這些項目,您應該利用連鎖樣式 persist 或 merge 來評估對實體呼叫 mergepersist 的程式碼。 如果應用程式碼預期在插入新實體之前,會先檢查資料庫,應用程式應該會發現行為變更。

如果您新增 openjpa.Compatibility 內容到 persistence.xml 中,請重新執行分析,確定相關的檢查 JPA MetaModel 程式碼產生中有關 ListAttribute 的行為變更規則沒有新的結果。

如需相關資訊,請參閱