2015-09-07 36 views
0

另一個像這樣的線程。我爲此奮戰了4天。 註釋@Getter@Setter從龍目插件Hibernate5 OneToMany和ManyToOne映射在外鍵上爲空

Place

@Entity 
public class Place { 

    @Getter 
    @Setter 
    @OneToMany(mappedBy = "place", targetEntity = Tag.class, cascade = CascadeType.ALL) 
    private Set<Tag> tags; 
//... 
} 

Tag類,應該有很多

@Entity 
public class Tag { 
    @Getter 
    @Setter 
    @ManyToOne(cascade = CascadeType.ALL) 
    @JoinColumn(name = "fk_place_id") 
    private Place place; 
//... 
} 

,我已把它像這樣

database after save

節約看起來是任何情況下,單線sessionFactory.getCurrentSession().persist(entity)。用@OneToOne映射保存實體就像魅力一樣。

回答

1

您有一個雙向關聯。您只初始化關聯的一側,而這一側是反面(因爲它具有mappedBy屬性)。 Hibernate只關心所有者方面。所以,對於Hibernate,標籤和地點之間沒有關聯。

注意級聯= ALL在ManyToXxx協會沒有意義。如果100個標籤引用的是同一個地方,並且您刪除了其中一個標籤,則您不想刪除該地方。即使你想,那也不行,因爲還有99個標籤仍然引用它,這會導致引用完整性錯誤。

+0

奧基,所以我加'@JoinColumn(名稱=「fk_place_id」)''到類Place'現在'Place'類是這種關係的所有者。我的錯誤是因爲當我使用'@ JoinColumn'註解時,它會在我使用它的實體中創建列。我查看了大量的教程,並且在某些時候我只是盯着複製粘貼代碼而沒有思考。 –

+2

你不能那樣做。在雙向OneToMany中,許多方必須是所有者。你必須做的是'tagOne.setPlace(place); tagTwo.setPlace(地點);'。 –

+0

但它工作。那麼可以選擇以其他方式進行製作嗎?像這樣'place.setTags(tagsSet)'?如果我有100個標籤,我需要循環來設置位置。我知道你的解決方案從數據庫的角度來看是合乎邏輯的,但我正在尋求其他方式來做到這一點。 –

相關問題