我正在使用JPA,我想保留一个由对象(Domain)组成的对象(Action)。
有Action类代码:
@Entity(name="action")
@Table(name="action")
public class Action {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="num")
private int num;
@OneToOne(cascade= { CascadeType.PERSIST, CascadeType.MERGE,
CascadeType.REFRESH })
@JoinColumn(name="domain_num")
private Domain domain;
@Column(name="name")
private String name;
@Column(name="description")
private String description;
public Action() {
}
public Action(Domain domain, String name, String description) {
super();
this.domain=domain;
this.name=name;
this.description=description;
}
public int getNum() {
return num;
}
public Domain getDomain() {
return domain;
}
public String getName() {
return name;
}
public String getDescription() {
return description;
}
}
当我坚持使用新域的操作时,它可以正常工作。行动和域名是持久的。但是如果我尝试使用现有域来持久化Action,我会收到此错误:
javax.persistence.EntityExistsException:
Exception Description: Cannot persist detached object [isd.pacepersistence.common.Domain@1716286]. Class> isd.pacepersistence.common.Domain Primary Key> [8]
如果域名不存在,我如何坚持我的行动并自动保留域名?如果存在,我如何才能持久保存Action并将其与现有域链接。
答案 0 :(得分:1)
从您发布的例外情况来看,您似乎正在尝试将分离的Domain
对象与新的Action
对象一起使用。在继续执行操作之前,您需要使用Domain
方法重新附加EntityManger.merge
对象:
domainObject = entityManager.merge(domainObject);
Action action = new Action(domainObject, "name", "description");
entityManager.persist(action);
如果要处理问题中描述的两种情况,可以在Action对象上使用merge而不是persist。 merge方法将保留新的Action,并将重新附加或持久化Domain对象(因为您指定了Cascade.MERGE)。
Action action = new Action(domainObject, "name", "description");
action = entityManager.merge(action);
请记住在合并后使用与Action关联的Domain对象的新实例。如果要在合并Action对象后使用域对象,请务必执行以下操作:
domainObject = action.getDomain();