我创建了一个简单的 EJB 应用程序,该应用程序使用 JPA 进行持久性,并且遇到了一个问题,即乐观锁定没有像我预期的那样运行。
该应用程序包含一个名为的类,该类Site
定义了数据库中名为 SITE 的表的模型。SITE 表包含一个名为 ROW_VERSION 的列,该列在Site
类中使用@version
注释进行引用。
每当更新记录时,ROW_VERSION 都会增加 1。到目前为止,一切都很好。
当应用程序使用该EntityManager find
方法读取行和该方法更新行之间的时间行发生变化时,就会出现问题EntityManager merge
。由于该行的 ROW_VERSION 已增加 1,因此与EntityManager find
调用该方法时不同,因此我希望OptimisticLockException
抛出一个,而是将更改写入表并进而覆盖所做的更改其他过程。
该应用程序在 WebSphere 8.5 上运行,并使用容器提供的 OpenJPA。
我是否误解了乐观锁定应该如何工作,或者我需要做些什么来实现这一点OptimisticLockException
?
站点类如下:
@Entity
@Table(name="SITE")
public class Site {
@Id
@Column(name="SITE_ID")
private int id;
@Column(name="SITE_NAME")
private String siteName;
@Column(name="SITE_ADDRESS")
private String address;
@Column(name="ROW_VERSION")
@Version
private long rowVersion;
//getters and setters
}
应用程序使用 Generic DAO 包装类来调用 EntityManager 方法。课程内容如下:
public abstract class GenericDAO<T> {
private final static String UNIT_NAME = "Test4EJB";
@PersistenceContext(unitName = UNIT_NAME)
private EntityManager em;
private Class<T> entityClass;
public GenericDAO(Class<T> entityClass) {
this.entityClass = entityClass;
}
public T update(T entity) {
return em.merge(entity);
}
public T find(int entityID) {
return em.find(entityClass, entityID);
}
//other methods
}
更新- 我做了更多调查,发现了这个http://pic.dhe.ibm.com/infocenter/wasinfo/v8r0/index.jsp?topic=%2Fcom.ibm.websphere.nd.multiplatform.doc% 2Finfo%2Fae%2Fae%2Fcejb_genversionID.html但即使我添加了@VersionColumn 和@VersionStrategy 注释,我仍然无法抛出OptimisticLockException。