簡體   English   中英

雙向一對多,一方為擁有方

[英]Bidirectional one-to-many with one as owning side

有沒有辦法讓“一個”成為一對多關系的所有者一方? 每一個樣本具有mappedBy@OneToMany 甚至這個類似問題的答案也是如此。

我希望一方是擁有方,因為當我添加一個多/子時,我也會更改一個/父的一些信息,我只想更新父,為了代碼簡單並確保它全部進入相同的 ACID 事務。

但我就是做不到。 Hibernate 不斷抱怨

實體映射中的重復列

我的實體:

public class Parent {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @OneToMany(fetch = EAGER, cascade = {ALL}, orphanRemoval = true)
    @JoinColumn(name = "parent_id", referencedColumnName = "id", nullable = false)
    private final Set<Child> children = new HashSet<>();

}

public class Child {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @ManyToOne
    private Parent parent;

}

解決實體錯誤映射中的重復列。

您可以從@JoinColumn注釋中刪除nullable=false ,如下所示:

代替

@JoinColumn(name = "parent_id", referencedColumnName = "id", nullable = false)

嘗試

@JoinColumn(name = "parent_id", referencedColumnName = "id", insertable = false, updatable = false)

但是如果你想保留nullable=false ,那么

要么刪除private Parent parent; Child類的聲明

或者

使用@Transient注釋或private transient Parent parent;使其成為瞬態private transient Parent parent;

你有什么

@JoinColumn(name = "parent_id", referencedColumnName = "id")

@OneToMany(mappedBy="parent", fetch = FetchType.EAGER, cascade = {CascadeType.ALL}, orphanRemoval = true)

從表面上看。 你做這件事的動機是什么?

編輯:是的,好的。 保持雙向關系的方式有所不同。 如果使用@JoinColumn則必須設置父級,如果使用mappedBy則不必設置父@JoinColumn ,但@JoinColumn是刪除了, insertable = false, updatable = false`,所以我不確定為什么有一個關於必須包括這些的討論。 另外,我不確定您為什么會遇到休眠重復列錯誤,我沒有得到類似的信息。 需要注意的是 CascadeType.ALL 是需要保存子級的,而無需設置父級。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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