EJB 3编辑数据库记录

时间:2012-06-10 21:28:57

标签: java mysql java-ee jpa ejb

我使用EJB和JPA更新数据库记录时遇到问题。持久性提供者:org.eclipse.persistence.jpa.PersistenceProvider

当我创建记录时,我正在使用此方法:

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可以做到这一点吗?我应该改变什么才能实现这一目标?

2 个答案:

答案 0 :(得分:5)

首先使用操作op = getEntityManager()。find(Operation.class,id)加载实体。然后执行op.setOperationStatus(value)。就是这样,它会在会话刷新/关闭时得到更新。

答案 1 :(得分:2)

问题是调用entityManager.merge(实体)将使用填充java对象的相同确切值更新db行(对应于您在对象上设置的ID)(即除了status和id之外的所有内容都为null )。您需要将对象从数据库中取出然后进行更新。

更好的选择可能是以下方法:

/**
 * 
 * @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);
}