级联类型:ALL,MERGE等

时间:2011-12-15 10:37:53

标签: java hibernate jpa

我有一个人物对象和一个计算机对象, 这个person对象有一个名为computer的字段, 一个人可以拥有一台计算机,一对一的关系。

class Person{

    @OneToOne(cascade=CascadeType.ALL)//in which situations this is true?  
    @JoinColumn(name = "computer_id",nullable=false) 
    private Computer computer;

    getComputer(){...}
    setComputer(Computer c){...}

    @Id
    private String id;
}

class Computer{

    @Id
    private String id;

}

我假设我在DB上有一个计算机对象,我用一个加载方法得到它。

Computer computer=entityManager.loadById({an id});
Person p=new Person();
p.setComputer(computer);

现在,如果我想保存计算机和人,我该怎么办?

entityManager.persist(p);

我无法生成相同的错误,但前段时间我有一个“分离的实体传递给持久化”错误。

将所有内容保存到数据库而不重复的最合适方法是什么?

您也可以建议资源(可能是一本书)了解在不同情况下该做什么。

1 个答案:

答案 0 :(得分:3)

在您描述的情况下,您不需要任何级联,并且持久保存用户就足够了:

  • 由于计算机已使用EM加载,因此它已连接到EM。在计算机上完成的任何更改都将自动保存到数据库,无需任何操作
  • 用户是一个新实体,尚未持久化。要使其持久,您必须致电persist。在此调用之后,它将被附加到EM,并且对用户所做的任何更改也将自动保存到数据库而无需任何操作。

如果您创建了一台新计算机,然后是一位新用户,将该计算机设置为该用户并持久保存该用户,则可能会发生错误“已传递给持久性的已分离实体”。在这种情况下,EM抱怨因为你试图使持久的en实体(用户)引用另一个不持久的实体(计算机)。有两种解决方案:

  • 通过使用计算机调用persist
  • ,在使用户保持持久性之前使计算机保持持久性
  • 使用cascade = PERSIST或cascade = ALL注释person.computer关联,以便在用户持久化时使计算机自动执行。请注意,ALL还包括REMOVE。因此,如果您删除用户,其计算机也将被删除。