Java 级联类型:全部、合并等

Java 级联类型:全部、合并等,java,hibernate,jpa,Java,Hibernate,Jpa,我有一个person对象和一个computer对象, 此person对象有一个名为computer的字段, 一个人可以拥有一台电脑,一对一的关系 class Person{ @OneToOne(cascade=CascadeType.ALL)//in which situations this is true? @JoinColumn(name = "computer_id",nullable=false) private Computer computer;

我有一个person对象和一个computer对象, 此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上有一个计算机对象,我用load方法得到它

Computer computer=entityManager.loadById({an id});
Person p=new Person();
p.setComputer(computer);
现在,如果我想同时保存计算机和人,我应该怎么做

entityManager.persist(p);
我不能生成相同的错误,但不久前我得到了一个“分离实体传递到持久化”错误

在不重复的情况下,将所有内容保存到DB中最合适的方法是什么


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

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

  • 由于计算机已使用EM加载,因此它已连接到EM。在计算机上所做的任何更改都将自动保存到数据库,而无需任何操作
  • 用户是一个新实体,它还不是持久的。要使其持久化,必须调用
    persist
    。此调用后,它将附加到EM,对用户所做的任何更改也将自动保存到数据库中,而无需任何操作
如果您创建了一台新计算机,然后创建了一个新用户,将计算机设置为该用户,并持久化该用户,则可能会发生“已分离实体传递到持久化”错误。在这种情况下,EM会抱怨,因为您试图使持久的en实体(用户)引用另一个非持久的实体(计算机)。有两种解决方案:

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

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

  • 由于计算机已使用EM加载,因此它已连接到EM。在计算机上所做的任何更改都将自动保存到数据库,而无需任何操作
  • 用户是一个新实体,它还不是持久的。要使其持久化,必须调用
    persist
    。此调用后,它将附加到EM,对用户所做的任何更改也将自动保存到数据库中,而无需任何操作
如果您创建了一台新计算机,然后创建了一个新用户,将计算机设置为该用户,并持久化该用户,则可能会发生“已分离实体传递到持久化”错误。在这种情况下,EM会抱怨,因为您试图使持久的en实体(用户)引用另一个非持久的实体(计算机)。有两种解决方案:

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

非常感谢您的回复。我想问,什么时候“坚持”会出现。你说当我调用persist之后,进行更改并将其转到db,但直到什么时候?在什么之后,我的对象失去了持久性。例如,一个方法:
publiccomputerfoo(){computerc=newcomputer();em.persist(c);}
在main中我调用foo
Computer=foo()
Person=newperson();新增人员(公司);em.person直到实体分离,即当围绕这些调用的事务被提交或回滚时。如果对实体进行序列化和反序列化,结果实体也会分离。非常感谢您的回复。我想问,什么时候“坚持”会出现。你说当我调用persist之后,进行更改并将其转到db,但直到什么时候?在什么之后,我的对象失去了持久性。例如,一个方法:
publiccomputerfoo(){computerc=newcomputer();em.persist(c);}
在main中我调用foo
Computer=foo()
Person=newperson();新增人员(公司);em.person直到实体分离,即当围绕这些调用的事务被提交或回滚时。如果序列化和反序列化实体,则结果实体也会分离。