JPA OneToMany和ManyToOne关系 [英] JPA OneToMany and ManyToOne Relationships
问题描述
我有三个类,一个名字是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 class APost extends Post {
@ManyToOne(fetch = FetchType.LAZY)
public用户用户;
}
它是这样工作的,但在db中生成emty表。其中必须包含外键。当我尝试使用mappedBy和JoinColumn annotains时,我失败了。如何解决这个问题?
额外信息: ;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name =id)
公共用户用户;
和
@OneToMany(fetch = FetchType.LAZY,cascade = CascadeType.ALL,mappedBy =id)
public List< APost> aPosts;
我得到
JPA错误发生(无法构建EntityManagerFactory):实体映射中的重复列:models.post.APost column:id(应该使用insert =falseupdate =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 )
everthing可以正常工作:)
正如我在这篇文章,并在我的书中高性能Java持久性,您不应该使用单向 @OneToMany
注释,因为:
- 它生成低效的SQL语句
- 它会创建一个额外的表h会增加数据库索引的内存占用空间现在,在第一个示例中,双方都拥有该关联,并且这很糟糕。
虽然
@JoinColumn
会让@OneToMany
一方负责关联,但它绝对不是最好的选择。因此,请始终在@OneToMany
一侧使用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用户用户;
}
public class APost extends Post {
@ManyToOne(fetch = FetchType.LAZY)
public用户用户;
}
I have three classes one of the name is User and this user have other classes instances. Like this;
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; }
it's working like this but generates emty tables in db. Which have to contains foreign keys. When I tried to use mappedBy and JoinColumn annotains I got failed. How can I resolve this?
Extra information:
When I changed with;
@ManyToOne(fetch=FetchType.LAZY) @JoinColumn(name="id") public User user;
and
@OneToMany(fetch=FetchType.LAZY, cascade = CascadeType.ALL, mappedBy="id") public List<APost> aPosts;
I'm getting
A JPA error occurred (Unable to build EntityManagerFactory): Repeated column in mapping for entity: models.post.APost column: id (should be mapped with insert="false" update="false")
Final Edit: Finally, I was totaly wrong about jpa annotaions. :( When i change
@OneToMany(fetch=FetchType.LAZY, cascade = CascadeType.ALL, mappedBy="id")
to
@OneToMany(fetch=FetchType.LAZY, cascade = CascadeType.ALL, mappedBy="user")
and
@ManyToOne(fetch=FetchType.LAZY) @JoinColumn(name="user_id")
everthing works ok. :)
解决方案As I explained in this article and in my book, High-Performance Java Persistence, you should never use the unidirectional
@OneToMany
annotation because:- It generates inefficient SQL statements
- It creates an extra table which increases the memory footprint of your DB indexes
Now, in your first example, both sides are owning the association, and this is bad.
While the
@JoinColumn
would let the@OneToMany
side in charge of the association, it's definitely not the best choice. Therefore, always use themappedBy
attribute on the@OneToMany
side.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; }
这篇关于JPA OneToMany和ManyToOne关系的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!