2012-06-10 79 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); 
}