何时使用/不使用,@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的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate @OneToOne 映射不加入列?

在 Repository 中使用 Doctrine 2 ORM 和 OneToOne 获得“排名”

@OneToOne(optional=false) 和 @JoinColumn(nullable=false) 一起使用

你不会还搞不清楚Spring Data JPA的关联关系注解如何使用吧?

你不会还搞不清楚Spring Data JPA的关联关系注解如何使用吧?

在 Hibernate / JPA 2.1 中延迟加载的 @OneToOne 映射不起作用?