Java JPA @OneToMany需要配合@ManyToOne进行互通吗?

10
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语句创建了两个表,我想为它们创建实体类。对于类B,我有以下成员属性:

@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注释属性,那么以后会不会影响到我?

3个回答

15
是否需要或者说是否有必要在@ManyToOne上添加一个相应的@OneToMany?并不是强制性的,这是一种设计决策。整个问题就在于...你想要这样(即单向关联):uni-directional还是这样(即双向关联):bi-directional如果你不需要从A中获取B,则可以跳过属性“bs”以及A端的“OneToMany”。如果现在决定不使用@OneToMany注释的属性,则不会影响你,而且如果你发现需要它,可以随时添加它。

+1,并检查@Pascal Thivent:感谢指出我如果需要可以随后添加它的建议,这是我主要关注的问题。 - bguiz
我通常尽可能避免使用单向映射。仅仅因为数据库中的某个模型使用了单独的连接表(出于任何原因),并不意味着我的对象模型也必须这样做。在上面的例子中,一个OneToOne映射对于单向解决方案已经足够了(当然,这必须符合领域)。 - lostiniceland
这很清晰自信。我有这个疑问一段时间了,但现在一切都变得清晰明了。 - Saurabh Tiwari
@OneToMany即使在您不需要它的情况下仍然有益。使用cascade属性,您可以在删除父实体时自动删除子实体(在@ManyToOne侧)。 - Maurice

2

它们是可选的。如果您不想使用它们,就没有必要将它们添加到您的模型中。

我建议尽量避免反向映射,因为这样的集合可能会变得非常大,并且大多数持久层对此处理得不太好。在许多情况下,您必须自己处理与这些集合相关的已加载/已管理实体的添加/删除。因此,只有在确实能够使事情更容易时才添加它们。


+1 @Daniel Bleisteiner:处理它们所需的大量代码可能会变得相当笨拙。感谢您的建议。 - bguiz

0

当然不是。这是关于单向与双向关系的设计决策。在大多数情况下,更好的选择是使用单向关系,特别是对于领域类。这样做可以更好地表达你的领域的含义。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接