2010-05-10 47 views
7
Create Table A (
ID varchar(8), 
Primary Key(ID) 
); 

Create Table B (
ID varchar(8), 
A_ID varchar(8), 
Primary Key(ID), 
Foreign Key(A_ID) References A(ID) 
); 

既然我已经创建使用上面的SQL语句两个表,我想创建Entity类对他们来说,该类B,我有这些成员属性:Java JPA @OneToMany需要回报@ManyToOne?

@Id 
@Column(name = "ID", nullable = false, length = 8) 
private String id; 
@JoinColumn(name = "A_ID", referencedColumnName = "ID", nullable = false) 
@ManyToOne(optional = false) 
private A AId; 

A类,我是否需要回报多对一的关系?

@Id 
@Column(name = "ID", nullable = false, length = 8) 
private String id; 
@OneToMany(cascade = CascadeType.ALL, mappedBy = "AId") 
private List<B> BList; //<-- Is this attribute necessary? 

它是一个必要或一个好主意,有对@ManyToOne互惠@OneToMany?如果我现在做出设计决定忽略@OneToMany带注释的属性,那会不会再让我进一步咬我?

回答

11

@ManyToOne有一个相互@OneToMany的必要或好主意吗?

不,它不是强制性的,这是一个纯粹的设计决定。整个问题是...你想这(即单向协会):

uni-directional

还是这个(即双向关联):

bi-directional

如果您不需要从A获取Bs,那么您可以跳过A侧的bs属性和OneToMany

如果我做出设计决定,现在不再提供@OneToMany注释属性,它会回来咬我。

不,您可以稍后添加它,如果你发现你需要它。

+0

+1和检查@Pascal Thivent:您指出我可以在以后添加它,如果我需要它:那是我的主要关注点。 – bguiz 2010-05-11 06:42:20

+0

我通常尽量避免单向映射。仅仅因为数据库中的某些东西是用单独的连接表建模的(无论出于何种原因)并不意味着我的对象模型也必须这样做。在上面的例子中,OneToOne-Mapping对于单向解决方案就足够了(当然这必须坚持域)。 – lostiniceland 2015-08-04 09:29:49

2

它们是可选的。如果您不想使用它们,则无需将它们添加到您的模型中。

我sugguest避免反向映射,因为在所有此类藏品可能会变得相当大,最持久化层不会处理这些非常好。在很多情况下,您必须自己处理添加/删除已加载/管理的与这些集合相关的实体。所以只有在他们真的让事情变得更简单时才加上这些。

+0

+1 @Daniel Bleisteiner:处理它们所需的大量代码可能非常笨重。感谢您的建议 – bguiz 2010-05-11 06:44:51