2010-04-21 58 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