2013-10-05 42 views
1

我正在使用JPA實現EclipseLink和MySQL服務器作爲我的應用程序的持久層。我的問題是,一個已經被保存並且已經擁有一個id的對象正在通過與CascadeType.All的多對一關係被第二次插入。當使用CascadeType.ALL時,JPA會保留兩次相同的對象

這裏的實體:

@Entity 
@Table(name = "messages") 
public class Message extends DbObject { 

    @ManyToOne(cascade = CascadeType.ALL) 
    @JoinColumn(name = "user_id") 
    public User author; 

    public String message = ""; 

    public Timestamp timestamp; 

     // Getters and setters removed .... 
} 


@Entity 
@Table(name = "users") 
public class User extends DbObject { 

    private String name; 

    // Getters and setters removed .... 
} 


@MappedSuperclass 
public abstract class DbObject { 

    @Id 
    @GeneratedValue(strategy = GenerationType.SEQUENCE) 
    private long id; 

    public long getId() { 
     return id; 
    } 

    public void setId(long id) { 
     this.id = id; 
    } 
} 

當我運行下面的代碼,然後我在我的「用戶」表中的兩個條目。但我只想將現有的用戶分配給消息對象,而不是創建新的用戶。

User user = getCurrentUser(); // The user object is already persistent 

Message msg = new Message(); 
msg.setUser(user); 
EntityManager em = createEntityManager(); 
em.getTransaction().begin(); 
em.persist(msg); 
em.getTransaction().commit(); 
em.close(); 

回答

1

用戶從EntityManager的分離使用的是堅持消息,並與級聯堅持下去的關係,以用戶設定,JPA需要堅持也發生在你脫離用戶。選項是 A)使用當前持久性讀取它,以便管理它。除了級聯以外,堅持是對管理實體的禁止。 B)刪除所有關於消息 - >用戶關係的級聯C)使用合併而不是持久化消息實例。合併仍然會持續它,但會正確地將用戶狀態複製到託管用戶實例中。

相關問題