簡體   English   中英

Hibernate級聯:對象引用了一個未保存的瞬態實例-在刷新之前保存該瞬態實例

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM