3

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

4

0 回答 0