我正在尝试使用JPA持久性类更新基本的删除时间戳。这是代码:
And param env_url+entity_id
与 public void delete(Document document, EntityManager em, SessionContext ctx)
throws MyException {
try {
ctx.getUserTransaction().begin();
DocumentDB documentDB = em.find(WDSDocument.class, document.getId());
if (documentDB != null) {
em.lock(documentDB, LockModeType.WRITE);
documentDB.setDeletedAt(new Timestamp(System.currentTimeMillis()));
em.merge(documentDB);
em.flush(); // OptimisticLockException raised here
}
ctx.getUserTransaction().commit();
if (log.isDebugEnabled()) log.debug("DELETED " + document.getId());
} catch (Exception e) {
ctx.getUserTransaction().rollback();
throw new MyException(Utils.getError("ERR9", new String[] { "" + document.getId(), e.getMessage() }),
e);
}
}
相同的Id
文档已经存储在数据库中,我想更新一个字段。
document
行引发了异常,就好像另一个用户(线程)正在尝试更新同一对象一样,但是在我的应用程序中不是这种情况。
我已经阅读了JPA中的em.flush()
,并且我了解,当同一用户连续两次尝试更新对象而不先刷新/提交给数据库时,会引发该问题。
很明显,每当我尝试更新任何对象的OptimisticLockException
删除时间戳时,都会发生此错误,所以我猜我的documentDB
方法应该存在固有的错误,它会双重更新对象本身。到目前为止,我仍无法正确解决问题。
编辑
这是我的delete()
班
DocumentDB
其抽象超类为:
@Entity
@Table(name = "DOCUMENTS", schema = "WP")
public class DocumentDB extends AbstractEntity {
private static final long serialVersionUID = -98765134L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID_DOCUMENT", nullable = false)
private int id;
@Column(name = "SOURCE")
private String source = null;
@Column(name = "CREATION_DATE")
private Date creationDate;
@Column(name = "TITLE")
private String title = null;
@Column(name = "AUTHOR")
private String author = null;
@Column(name = "URL")
private String url = null;
@Column(name = "DELETED_AT")
private Timestamp deletedAt = null;
@Override
public Integer getId() {
return id;
}
@Override
public void setId(int id) {
this.id = id;
}
public Date getCreationDate() {
return creationDate;
}
public void setCreationDate(Date creationDate) {
this.creationDate = creationDate;
}
public String getSource() {
return source;
}
public void setSource(String source) {
this.source = source;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public Timestamp getDeletedAt() {
return deletedAt;
}
public void setDeletedAt(Timestamp deletedAt) {
this.deletedAt = deletedAt;
}
}
为了更好地理解此问题,请提供一些有关后续步骤的指南?
更新
到目前为止,我还没有找到问题的根本原因。我怀疑我的EclipseLink JPA实施在更新for循环内的实体时确实发生了奇怪的事情。
不幸的是,目前我没有足够的时间和资源进行更深入的研究,并且我使用悲观锁作为解决方法。希望将来能找到真正的问题。