何时使用,不使用OneToOne和ManyToOne

时间:2010-07-16 09:40:27

标签: java jpa

我刚开始阅读JPA,并在hibernate中实现了解细节。但是,为了继续发展到那时,你能帮助澄清一个基本的qn。

  1. 何时使用OneToOne
    如果实体管理器需要处理相关对象的持久性,我可以使用OneToOne。关键是,我总是可以在不指定oneToOne的情况下生活,但是我负责管理关系并确保引用的对象不处于瞬态状态。这是真的吗?

  2. 何时使用或不使用,ManyToOne
    假设我正在定义一个Employee类,需要使用Employer定义rel。在这种情况下,我是否需要指定manyToOne,如下所示,或者如果不是

     @Entity   
        public class Employer {  
        String name;   
        }   
    
        @Entity   
        class Employee {  
            String name;  
            @ManytoOne  //or not??   
            Employer employer;   
            }
    
  3. 感谢

2 个答案:

答案 0 :(得分:7)

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是一个很好的参考资料。

答案 1 :(得分:3)

  

何时使用OneToOne   如果实体管理器需要处理相关对象的持久性,我可以使用OneToOne。关键是,我总是可以在不指定oneToOne的情况下生活,但是我负责管理关系并确保引用的对象不处于瞬态状态。这是真的吗?

如果您不希望实体管理器处理操作,则无需标记关系。您可以将相关实体作为临时字段并手动保留相关实体。但在这种情况下,您将不会使用JPA提供的完整功能列表。

通过标记关系,EntityManager了解数据库结构。如果你想利用JPA的力量,这是必不可少的。

Eg: class Car
      {
         @OneToOne
         Warehouse warehouse;
         //other fields
      }

这里

  • 我可以在检索汽车时检索相关的Warehouse对象

  • 我可以在持有汽车的同时坚持使用Warehouse对象(使用级联选项,如下面的海报所述)

  • 同样更新,删除......

除了这些之外,在使用JPQL时,

你可以遍历仓库

,如

em.createQuery("select c.warehouse from Car c"); 

除非您标记关系,否则这些行不通。