单向 JPA

Posted

技术标签:

【中文标题】单向 JPA【英文标题】:Unidirectional JPA 【发布时间】:2013-02-17 14:30:23 【问题描述】:

我有一个数据库(JPA 2 Eclipselink),其中有订单和项目,每个订单可以有很多项目,每个项目只能分配给一个订单。这是单向关系。

订单实体:

@Entity
public class Order implements Serializable 
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

Item 实体有:

@Entity
public class Item implements Serializable 
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    @ManyToOne
    Order o;

但是如何设置如果从数据库中删除一个订单,所有引用它的项目都将被删除?是否有可能在单向关系中,或者我必须创建双向并将 @OneToMany(cascade=remove) 放在订单实体类中?还是保持单向,但拥有方将是 Order 并从 item Entity 中删除对 order 的任何引用?

【问题讨论】:

【参考方案1】:

您可以按照您在问题中的建议进行双向关联并添加级联,或者您明确删除与订单链接的所有项目(使用 JPQL 删除查询,或通过搜索它们然后删除它们),然后删除订单。

在这种情况下双向关联是有意义的,您可能会在代码中的其他几个地方从中受益。

【讨论】:

谢谢,如果我使用双向关系,我是否必须使用@JoinColumn 或者我可以在拥有部分关系的另一侧添加 mappedBy。如果我在 id 字段上声明 @Column(name="ORDER_ID"),那么 mappedby 应该是 mappedby="ORDER_ID" 而不是 (..)="id" 是吗?我不太了解 JoinColumn 您必须在 Order.items 上使用 mappedBy="order",并在 Item.order 上保持原样。 mappedBy="order" 说:去查看关联另一端(即在项目中)的“订单”字段,看看这个双向关联是如何映射的。 描述得非常好,谢谢!我可以问你@JoinColumn 做什么吗?再次感谢 JoinColumn 允许告诉关联是使用连接列映射的。这是多对一关联的默认设置。因此,您将使用它来自定义用于保存订单表外键的列的名称。就像 Column 一样,如果你不使用它,它会使用一个默认名称。见docs.oracle.com/javaee/6/api/javax/persistence/JoinColumn.html

以上是关于单向 JPA的主要内容,如果未能解决你的问题,请参考以下文章

JPA中实现单向一对多的关联关系

Entity-Bean (JPA) 中的单向关系

JPA:单向多对一和级联删除

JPA - 使用 EclipseLink 保持单向一对多关系失败

onetomany 单向与使用 jpa 的可连接设置

JPA一对多单向