还有另一个这样的话题。我和它一起战斗了4天。
注释@Getter
和@Setter
来自lombok插件
我的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;
//...
}
我正在保存它
Tag tagOne = new Tag("tagOne");
Tag tagTwo = new Tag("tagTwo");
Set<Tag> tagSet = new HashSet<>();
tagSet.add(tagOne);
tagSet.add(tagTwo);
Place place = new Place();
place.setTags(tagSet);
placeService.save(place);
保存外观是每个案例的单行sessionFactory.getCurrentSession().persist(entity)
。使用@OneToOne
映射保存实体就像魅力一样。
答案 0 :(得分:1)
您有双向关联。您只初始化关联的一侧,而那一侧是反面(因为它具有mappedBy
属性)。 Hibernate只关心所有者方面。因此,对于Hibernate,标签和地点之间没有关联。
请注意,ManyToXxx关联中的cascade = ALL并不合理。如果100个代码引用了同一个地方,并且您删除了其中一个代码,则您也不想删除该地点。即使你想这样做,也不会有效,因为99个其他标签仍然引用它,这将导致引用完整性错误。