级联持续存在和现有对象

时间:2010-04-21 09:20:20

标签: java jpa persistence

我正在使用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并将其与现有域链接。

1 个答案:

答案 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();