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