我有一个人物对象和一个计算机对象, 这个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);
我无法生成相同的错误,但前段时间我有一个“分离的实体传递给持久化”错误。
将所有内容保存到数据库而不重复的最合适方法是什么?
您也可以建议资源(可能是一本书)了解在不同情况下该做什么。
答案 0 :(得分:3)
在您描述的情况下,您不需要任何级联,并且持久保存用户就足够了:
persist
。在此调用之后,它将被附加到EM,并且对用户所做的任何更改也将自动保存到数据库而无需任何操作。如果您创建了一台新计算机,然后是一位新用户,将该计算机设置为该用户并持久保存该用户,则可能会发生错误“已传递给持久性的已分离实体”。在这种情况下,EM抱怨因为你试图使持久的en实体(用户)引用另一个不持久的实体(计算机)。有两种解决方案:
persist
person.computer
关联,以便在用户持久化时使计算机自动执行。请注意,ALL还包括REMOVE。因此,如果您删除用户,其计算机也将被删除。