Öme*_* AK 49 java hibernate jpa one-to-many many-to-one
我有三个类,其中一个名称是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;
}
Run Code Online (Sandbox Code Playgroud)
它的工作方式与此类似,但在db中生成emty表.哪个必须包含外键.当我尝试使用mappedBy和JoinColumn annotains时,我失败了.我该如何解决这个问题?
额外的信息:
当我换了;
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="id")
public User user;
Run Code Online (Sandbox Code Playgroud)
和
@OneToMany(fetch=FetchType.LAZY, cascade = CascadeType.ALL, mappedBy="id")
public List<APost> aPosts;
Run Code Online (Sandbox Code Playgroud)
我越来越
发生JPA错误(无法构建EntityManagerFactory):实体映射中的重复列:models.post.APost列:id(应使用insert ="false"update ="false"映射)
最终编辑:最后,我对jpa注释完全错了.:(当我改变
@OneToMany(fetch=FetchType.LAZY, cascade = CascadeType.ALL, mappedBy="id")
Run Code Online (Sandbox Code Playgroud)
至
@OneToMany(fetch=FetchType.LAZY, cascade = CascadeType.ALL, mappedBy="user")
Run Code Online (Sandbox Code Playgroud)
和
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="user_id")
Run Code Online (Sandbox Code Playgroud)
everthing工作正常.:)
Adr*_*hum 65
我不确定你的问题("空表"等的含义,或者如何mappedBy和JoinColumn不工作).
我认为你试图建立双向关系.
首先,你需要决定哪一方"拥有"这种关系.Hibernate将在这方面建立关系基础.例如,假设我让Post方拥有关系(我正在简化你的例子,只是为了保持关键),映射将如下所示:
(希望语法是正确的.我只是通过记忆来编写它们.但是这个想法应该没问题)
public class User{
@OneToMany(fetch=FetchType.LAZY, cascade = CascadeType.ALL, mappedBy="user")
private List<Post> posts;
}
public class Post {
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="user_id")
private User user;
}
Run Code Online (Sandbox Code Playgroud)
通过这样做,表格Post将具有user_id存储关系的列.休眠越来越由关系user中Post(而不是posts在User.如果你有你会发现其中的差别Post的user,但缺少User的posts).
你提到过mappedBy并且JoinColumn没有工作.但是,我相信这实际上是正确的方法.请告诉我这种方法是否适用于您,并提供有关该问题的更多信息.我认为问题是由于其他原因造成的.
编辑:
关于使用的一些额外信息,mappedBy因为它通常会引起混淆.在mappedBy,我们将"属性名称"放在双向关系的对面,而不是表列名.
Vla*_*cea 28
正如我在本文和我的书" 高性能Java持久性"中所解释的那样,您不应该使用单向@OneToMany注释,因为:
现在,在你的第一个例子中,双方都拥有这种关联,这很糟糕.
虽然@JoinColumn会让@OneToMany负责该协会的方面,但它绝对不是最好的选择.因此,始终使用侧面的mappedBy属性@OneToMany.
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;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
125736 次 |
| 最近记录: |