【问题标题】:Java JPA @OneToMany needed to reciprocate @ManyToOne?Java JPA @OneToMany 需要回报@ManyToOne?
【发布时间】:2011-02-17 13:32:44
【问题描述】:
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 类,我有这些成员属性:

@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 带注释的属性,那会不会再进一步​​咬我?

【问题讨论】:

    标签: java orm jpa persistence


    【解决方案1】:

    为@ManyToOne 设置互惠的@OneToMany 是必要的还是好主意?

    不,这根本不是强制性的,这是一个纯粹的设计决定。整个问题是......你想要这个(即单向关联):

    或者这个(即双向关联):

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

    如果我现在做出设计决定省略 @OneToMany 注释属性,我会回来进一步咬我。

    没有,以后如果发现需要可以添加。

    【讨论】:

    • +1 并检查@Pascal Thivent:指出如果需要,我可以稍后添加:这是我主要关心的问题。
    • 我通常会尽量避免单向映射。仅仅因为数据库中的某些东西是用单独的连接表建模的(无论出于何种原因),并不意味着我的对象模型也必须这样做。在上面的示例中,OneToOne-Mapping 对于单向解决方案就足够了(当然这必须遵守域)。
    • 这是相当清楚和自信的。我有一段时间有这个疑问,但现在一切都说得通了。
    • @OneToMany 仍然是有益的,即使您不需要它。使用cascade 属性,您可以在删除父实体时自动删除子实体(在@ManyToOne 一侧)
    【解决方案2】:

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

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

    【讨论】:

    • +1 @Daniel Bleisteiner :处理它们所需的大量代码可能会变得非常笨拙。感谢您的建议
    【解决方案3】:

    当然不是。那是一对两个方向关系之间的设计决策。在大多数情况下,更好的选择是有一个方向关系,特别是如果它是一个域类。这样做,您的设计将更好地表达您的领域的意思。

    【讨论】:

      猜你喜欢
      • 2016-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多