我正在將 Hibernate 3 應用程式遷移到 Hibernate 5.2。我們有幾個具有級聯的一對一單向映射(我們不能進行雙向映射,因為父級對其他物體一無所知)。以下(簡化示例)在最新的 Hibernate 3.x 和最新的 Hibernate 4.x 中運行良好,但在 Hibernate 5.2 中開始遇到 ConstraintViolationExceptions:
public class Person {
@Id
@GeneratedValue(generator="system-uuid")
@GenericGenerator(name="system-uuid", strategy = "uuid")
@Column(name="person_id", length=32)
public String id;
/* other fields, getters and setters */
}
public class EnhancedPerson {
@Id
@Column(name="person_id", length=32)
@GeneratedValue(generator="foreign")
@GenericGenerator(
name="foreign",
strategy = "foreign",
parameters = { @Parameter(name="property", value="person") }
)
private String id;
@OneToOne(cascade = CascadeType.ALL, optional = false)
@PrimaryKeyJoinColumn
private Person person;
/* other fields, getters and setters */
}
據我所知,在洗掉 a 時EnhancedPerson,hibernate 首先嘗試洗掉Person(因為級聯),當然這會遇到外鍵違規(因為EnhancedPerson必須參考 a Person,所以需要先洗掉它)。
我嘗試簡化映射以使用 JPA 注釋,如下所示:
public class EnhancedPerson {
@Id
private String id;
@OneToOne(cascade = CascadeType.ALL, optional = false)
@MapsId
@JoinColumn("person_id")
private Person person;
/* other fields, getters and setters */
}
但結果是一樣的。據我所知,通常的建議是不要從子級級聯到父級(例如這個答案),hibernate 的檔案也說只有關聯的父級才有意義將其物體狀態轉換級聯到子級。
我還發現這個對話似乎相關,但投訴是從 Hibernate 5.3 到 5.4,在我的情況下,它在從 4.x 到 5.2 時停止作業。另外,我認為術語是在那里交換的(所謂的 Child 是關系的父/所有者,而所謂的 Parent 是孩子/具有外鍵),除非我是那個混淆的人。
任何指標我可以如何解決這個問題,或者如果這在更新的 Hibernate 版本中作業正常?從子級級聯到父級通常可能沒有意義,但在我們的例子中,如果子級被洗掉,則保留父級是沒有意義的(此外,如果通過子級修改父級參考,這些更改也應該是堅持孩子時堅持)。另外,我想知道為什么以前支持它而不再支持(我猜是一個錯誤,但它可能是一個有目的的重大更改)。
uj5u.com熱心網友回復:
將此作為答案重新發布 - Hibernate 5.2 非常古老,同時在較新版本中修復了許多錯誤。正如您通過嘗試發現的那樣,問題在 Hibernate 5.6.12.Final 中消失了,因此解決方案是更新您的依賴項;)
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/517215.html
標籤:爪哇休眠jpa
上一篇:PostgreSQL遞回查找值
