何时使用/不使用,@OneToOne 和 @ManyToOne
Posted
技术标签:
【中文标题】何时使用/不使用,@OneToOne 和 @ManyToOne【英文标题】:When to use / not to use, @OneToOne and @ManyToOne 【发布时间】:2010-07-16 09:40:27 【问题描述】:我刚开始阅读 JPA 及其在 Hibernate 中的实现。为了更好地理解细节,我需要澄清一些基础知识。
何时使用@OneToOne
?
如果实体管理器需要处理相关对象的持久性,我可以使用@OneToOne
。关键是,我可以在不指定@OneToOne
的情况下一直生活,但我有责任管理关系并确保引用的对象不处于瞬态。
这是真的吗?
何时使用,或不使用@ManyToOne
?
比如说,我正在定义一个 Employee 类,并且需要定义与 Employer 类的关系。在这种情况下,我需要指定@ManyToOne
吗?
@Entity
public class Employer
String name;
@Entity
class Employee
String name;
@ManytoOne //or not??
Employer employer;
【问题讨论】:
【参考方案1】:1: 处理实体关系时,您必须始终使用适当的注释(OneToOne、OneToMany、ManyToOne 或 ManyToMany)。您可以选择自己确保关系背后的实体不是瞬态的,还是在 OneToOne 注释上指定 cascade 属性以让 JPA 为您处理。这允许您创建一个完整的对象图并在一次调用中持久化它们:
@OneToOne(cascade = CascadeType.ALL)
private MyType myType;
2: 是的,雇主-雇员关系听起来像是 OneToMany 关系,而雇员-雇主关系将是 ManyToOne。如果您希望有两个方向,这称为双向关系。详情请查看relevant section in the Java EE tutorial。
JPA section in the Java EE tutorial 是一个很好的参考。
【讨论】:
【参考方案2】:何时使用 OneToOne 如果实体管理器需要处理相关对象的持久性,我可以使用 OneToOne。关键是,我总是可以在不指定 oneToOne 的情况下生活,但是我有责任管理关系并确保引用的对象不处于瞬态。这是真的吗?
如果您不希望实体管理器处理操作,则无需标记关系。您可以将相关实体作为临时字段并手动保留相关实体。但在这种情况下,您不会使用 JPA 提供的全部功能列表。
通过标记关系,EntityManager 可以了解数据库结构。如果您想利用 JPA 的强大功能,这是必不可少的。
Eg: class Car
@OneToOne
Warehouse warehouse;
//other fields
这里
我可以在检索汽车时检索相关的 Warehouse 对象
我可以在持久化 Car 的同时持久化一个 Warehouse 对象(使用下面的海报解释的级联选项)
同样更新、删除...除了这些,在使用 JPQL 时,
你可以穿越到仓库
如
em.createQuery("select c.warehouse from Car c");
除非您标记关系,否则这些将不起作用。
【讨论】:
以上是关于何时使用/不使用,@OneToOne 和 @ManyToOne的主要内容,如果未能解决你的问题,请参考以下文章
在 Repository 中使用 Doctrine 2 ORM 和 OneToOne 获得“排名”
@OneToOne(optional=false) 和 @JoinColumn(nullable=false) 一起使用
你不会还搞不清楚Spring Data JPA的关联关系注解如何使用吧?