2012-06-10 80 views
2

我在使用EJB和JPA更新數據庫記錄時遇到了問題。持久性提供商:org.eclipse.persistence.jpa.PersistenceProviderEJB 3編輯數據庫記錄

當我創造的紀錄,我用這個方法:

public void create(T entity) { 
    getEntityManager().persist(entity); 
} 

一切正常。現在我想編輯相同的記錄。對於例如我有一個實體:

@Entity 
@Table(name = "OPERATION") 
public class Operation implements Serializable { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "ID") 
    private Long id; 

    @Column(name = "OPERATION_AUTHOR") 
    private String operationAuthor; 

    @Column(name = "OPERATION_TYPE") 
    private String operationType; 

    @Column(name = "OPERATION_STATUS") 
    private String operationStatus; 

    @Column(name = "CREATED") 
    @Temporal(value = TemporalType.DATE) 
    private Date created; 

    @Column(name = "COMPLETED") 
    @Temporal(value = TemporalType.DATE) 
    private Date completed; 

    //Getters and setters 
} 

例如,我只想更新operationStatus。我正在創建一個實體,將其設置爲相同的記錄ID和新的operationStatus。對於更新我使用這種方法:

public void edit(T entity) { 
    getEntityManager().merge(entity); 
} 

問題是,當我更新狀態正確更新記錄,但所有其他列的值設置爲null以前一樣不剩。我只想更新operationStatus並保留其他值不變。這可能使用EJB來做到這一點嗎?爲了做到這一點,我應該改變什麼?

回答

4

首先加載實體,使用Operation op = getEntityManager()。find(Operation.class,id)。然後執行op.setOperationStatus(value)。就是這樣,它會在會話刷新/關閉時更新。

+0

如何didn'nt想起來我自己..一定是我的頭編程不工作了一整天:/。謝謝,完美:) –

1

的問題是,調用entityManager.merge(實體)將更新數據庫行(對應於你的對象上設置的ID)與填充Java對象完全相同的值(即,除了狀態和ID的一切都空值)。您需要將對象從數據庫中取出然後進行更新。

這個更好的選擇可能是下面的方法:

/** 
* 
* @param id - the ID of the entity to update 
* @param operationStatus - the status to apply 
*/ 
public void setOperationStatus(long id, String operationStatus){ 
    Operation o = getEntityManager().find(Operation.class,id); 
    o.setOperationStatus(operationStatus); 
    getEntityManager().merge(entity); 
}