3

我在使用 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 和 new operationStatus。为了更新我使用这种方法:

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

问题是当我更新记录时,状态会正确更新,但所有其他列的值都设置为null不像以前那样保留。我只想更新operationStatus,而其他值保持不变。使用 EJB 可以做到这一点吗?我应该改变什么来实现这一点?

4

2 回答 2

5

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

于 2012-06-10T21:31:51.717 回答
2

问题是调用 entityManager.merge(entity) 将使用填充 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);
}
于 2012-06-10T21:41:37.923 回答