2016-03-08 112 views
2

是否沒有辦法使'一'成爲一對多關係的所有者? @OneToMany中的每個樣本都有mappedBy。即使是對this similar question的回答也是如此。雙向一對多,擁有一個作爲擁有方

我希望一方是自己的一方,因爲當我添加一個多/孩子時,我還更改一個/父母的一些信息,我只想更新父代,以簡化代碼並確保它全部進入相同的ACID事務。

但我只是不能讓它工作。休眠不斷在映射抱怨

重複列實體

我的實體:

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; 

} 

回答

1

要在實體錯誤映射解決重複列。

您可以刪除,如下nullable=false@JoinColumn註釋:

而不是

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

嘗試

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

但是,如果你想保留nullable=false,然後

無論是從Child類中刪除private Parent parent;聲明

使瞬態或者使用@Transient註釋或private transient Parent parent;

+0

你部分正確。我不得不用'insertable = false,updatable = false'替換'nullable = false' – user384729

+0

@ user384729這是一個很好的觀點。通過包含'insertable = false,updatable = false',它不會觸發額外的更新查詢。 –

0

你有什麼

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

沒有從

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

面對它。你做這件事的動機是什麼?

編輯:是的,好的。你如何堅持雙向關係是有區別的。如果您使用mappedBy,則必須設置父級,並且如果使用@JoinColumn,則不必設置父級,但只有在刪除, insertable = false,updatable = false時,才能設置父級,所以我不確定爲什麼是關於必須包括這些的討論。此外,我不知道爲什麼你有休眠重複列錯誤,我沒有得到這樣的東西。應該注意的是,CascadeType.ALL是需要保存的,而不必設置父級。

+0

這很令人不安,我希望這是一個誤會;否則我很錯。 我認爲我擁有的東西(你的第一個代碼片段)使我的「Parent」成爲了關係的擁有者。因此,我不需要手動持久保留一個新的「子」。我可以將它添加到父級並更新父級。 隨着你的第二個片段,「孩子」將成爲自己的一面。我需要做'child.setParent(parent)'並手動持久化它,childDao.save(child)'。 – user384729

相關問題