我创建了一个简单的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
发生?
Site类如下:
@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抛出。