我有三个类,名称之一是User,此用户有其他类实例。像这样;
public class User{ @OneToMany(fetch=FetchType.LAZY, cascade = CascadeType.ALL) public List<APost> aPosts; @OneToMany(fetch=FetchType.LAZY, cascade = CascadeType.ALL) public List<BPost> bPosts; } public class BPost extends Post { @ManyToOne(fetch=FetchType.LAZY) public User user; } public class APost extends Post { @ManyToOne(fetch=FetchType.LAZY) public User user; }
它的工作方式是这样,但会在db中生成emty表。其中必须包含外键。当我尝试使用mapledBy和JoinColumn通告时,我失败了。我该如何解决?
额外的信息:
当我改变
@ManyToOne(fetch=FetchType.LAZY) @JoinColumn(name="id") public User user;
和
@OneToMany(fetch=FetchType.LAZY, cascade = CascadeType.ALL, mappedBy="id") public List<APost> aPosts;
我越来越
发生JPA错误(无法构建EntityManagerFactory):实体:models.post.APost列:id的映射中重复的列(应与insert =“ false” update =“ false”映射)
最终编辑: 最后,关于jpa注释,我完全错了。:(当我改变
@OneToMany(fetch=FetchType.LAZY, cascade = CascadeType.ALL, mappedBy="id")
至
@OneToMany(fetch=FetchType.LAZY, cascade = CascadeType.ALL, mappedBy="user")
@ManyToOne(fetch=FetchType.LAZY) @JoinColumn(name="user_id")
一切正常。:)
正如我在本文和我的书《高性能Java持久性》中所解释的那样,您绝对不应使用单向@OneToMany注释,因为:
@OneToMany
现在,在您的第一个示例中,双方都拥有该关联,这很糟糕。
虽然@JoinColumn可以让@OneToMany负责这一方面的一方,但绝对不是最佳选择。因此,请始终使用侧面的mappedBy属性@OneToMany。
@JoinColumn
mappedBy
public class User{ @OneToMany(fetch=FetchType.LAZY, cascade = CascadeType.ALL, mappedBy="user") public List<APost> aPosts; @OneToMany(fetch=FetchType.LAZY, cascade = CascadeType.ALL, mappedBy="user") public List<BPost> bPosts; } public class BPost extends Post { @ManyToOne(fetch=FetchType.LAZY) public User user; } public class APost extends Post { @ManyToOne(fetch=FetchType.LAZY) public User user; }