2010-04-21 56 views
1

我正在使用JPA,我想坚持一个由对象(域)组成的对象(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; 
    } 
} 

当我坚持用新域名的行动,它的工作原理。行动和域名坚持不懈。但是,如果我试图坚持使用现有域名的行动,我得到这个错误:

javax.persistence.EntityExistsException: 
Exception Description: Cannot persist detached object [[email protected]]. Class> isd.pacepersistence.common.Domain Primary Key> [8] 

我如何能坚持我的行动,并自动持续域,如果它不存在?如果存在,我如何坚持行动并将其与现有的域链接。

回答

1

从您发布的例外情况看,您似乎尝试使用分离的Domain对象与新的Action对象。持续的行动之前,你需要使用EntityManger.merge方法来重新附加Domain对象:

domainObject = entityManager.merge(domainObject); 
Action action = new Action(domainObject, "name", "description"); 
entityManager.persist(action); 

如果你想处理你的问题描述这两种情况下,你可以使用合并,而不是坚持行动的对象。合并方法将持续新的Action,并将重新附加或持久化Domain对象(因为您已指定Cascade.MERGE)。

Action action = new Action(domainObject, "name", "description"); 
action = entityManager.merge(action); 

只记得在合并之后使用与Action相关联的Domain对象的新实例。如果打算在合并Action对象后使用域对象,请务必做如下操作:

domainObject = action.getDomain(); 
+0

您给我的第一个解决方案在我的情况下不起作用。第二个完美的作品!谢谢你的答案! FF – 2010-04-21 13:41:45