[英]save the object using Hibernate object references an unsaved transient instance save the transient instance before flushing
[英]Hibernate cascades : Object references an unsaved transient instance - save the transient instance before flushing
@Entity
@Table(name = "parent")
public final class Parent extends Base {
@OneToOne(cascade = CascadeType.PERSIST, fetch = FetchType.EAGER)
private Person person;
並(除其他事項外)這樣做:
Parent parent = new Parent();
Person person = new Person();
parent.setPerson(person);
session.save(parent);
我得到提到的異常?
我需要手動調用session.save(person)嗎? 我必須在孩子的類定義中添加級聯類型注釋(它引用父類的地方)嗎?
還是我錯過了其他明顯的東西?
我不想使用CascadeType.ALL,因為當刪除父對象時,我想保留此人(孩子)。
兩個實體/表都擴展了一個公共基表:
@MappedSuperclass()
public abstract class Base {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Integer id;
public Integer getId() {
return id;
}
這會影響需要哪種級聯類型?
您沒有提到Hibernate版本,但是自從我開始使用它以來,它並沒有改變。
如您在Hibernate參考資料中所讀,要獲取Java標准SAVE_UPDATE
您需要在Hibernate中使用{CascadeType.PERSIST, CascadeType.MERGE}
。
編輯:看到更新的信息,您現在正在做的事情會使Hibernate將其視為雙向的一對一映射。 這基本上意味着,對於這兩個表中的任何一個,每個對象在另一個表中都必須有一個具有相同ID的對象。 因此,您不能僅刪除其中之一,否則會丟失FK完整性。
如果您希望它是單向映射,例如,如果您希望能夠刪除此人但離開父母-您必須指定一個FK,通常通過@JoinColumn
,例如@JoinColumn(name="PERSON_ID", unique=false, nullable=true, insertable=true, updatable=true)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.