版本更改时不会抛出OptimisticLockException

时间:2012-10-15 17:01:35

标签: websphere jpa-2.0 ejb-3.1 openjpa optimistic-locking

我创建了一个简单的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抛出。

0 个答案:

没有答案