Hibernate5 OneToMany和ManyToOne映射在外键上给出null

时间:2015-09-07 19:56:44

标签: spring hibernate jpa foreign-keys

还有另一个这样的话题。我和它一起战斗了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);

database after save

保存外观是每个案例的单行sessionFactory.getCurrentSession().persist(entity)。使用@OneToOne映射保存实体就像魅力一样。

1 个答案:

答案 0 :(得分:1)

您有双向关联。您只初始化关联的一侧,而那一侧是反面(因为它具有mappedBy属性)。 Hibernate只关心所有者方面。因此,对于Hibernate,标签和地点之间没有关联。

请注意,ManyToXxx关联中的cascade = ALL并不合理。如果100个代码引用了同一个地方,并且您删除了其中一个代码,则您也不想删除该地点。即使你想这样做,也不会有效,因为99个其他标签仍然引用它,这将导致引用完整性错误。