2013-04-03 75 views
1

使用EJB構建Web應用程序& JSF中的JPA我想知道如何獲取實體的修改字段。JPA:修改後的獨立實體和原始實體之間的差異

讓我們舉個簡單的例子:

@Entity 
@Table 
public class User implements Serializable { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "id", nullable = false) 
    private Integer id; 

    @Column(name = "firstname", nullable = false, length = 45) 
    private String firstname; 

    // ... 
} 

現在在我的EJB的方法「編輯」:

@Singleton 
public class UserService { 

    @PersistenceContext 
    protected EntityManager em; 

    public void edit(User user) { 
     this.em.merge(user); 
    } 
} 

我想知道是什麼改變了,例如說「用戶爲先命名爲'約翰',他現在'約翰'!「。

我正在做的步驟:

1)搜索用戶ID爲1 2)顯示的形式(如HTML)幫助使用JSF(結合通過JSF管理) 3)姓名字段進行編輯 4 )表單被提交,我得到我的用戶對象編輯 5)在堅持它之前,我想比較舊的 6)問題是,我不能使用this.em.find(1);獲取它,因爲我已經得到它

我試過了:

@Singleton 
public class UserService { 

    @PersistenceContext 
    protected EntityManager em; 

    public void edit(User user) { 
     System.out.println("USER 1 : " + user.getFirstname()); 
     User u2 = this.em.find(User.class, 1); 
     System.out.println("USER 1 : " + user.getFirstname()); 
     System.out.println("USER 2 : " + user.getFirstname()); 
     this.em.merge(user); 
     System.out.println("USER 1 : " + user.getFirstname()); 
     System.out.println("USER 2 : " + user.getFirstname()); 
    } 
} 

我越來越:

USER 1 : johny 
USER 1 : johny 
USER 2 : johny 
USER 1 : johny 
USER 2 : johny 

我敢肯定的是JPA內部不知道什麼已經被修改,有一個神奇的方法或我將保留我自己的舊值或使用SQL查詢數據庫自己例如?

回答

3

見,

http://wiki.eclipse.org/EclipseLink/FAQ/JPA#How_to_access_what_changed_in_an_object_or_transaction.3F

而且你可以創建一個新的EntityManager,是不是在同一個事務/持久化上下文,因此將返回的數據,因爲它是目前在數據庫上。 (注意這可能與開始時的不同,因爲其他用戶可能已經改變了數據)。

+0

嗨,先生@詹姆斯這個職位幫助。但是也許你也知道OpenJPA的對應。我發佈問題在這裏(http://stackoverflow.com/questions/32065813/jpa-context-getting-original-value-from-database)。謝謝 – Fritz

相關問題