小编Ric*_*ila的帖子

为什么我对使用Oracle的JPA中的悲观锁定无法正常工作

我正在尝试为在不同JBoss节点中运行的cron作业实现某种信号量.我正在尝试使用数据库(Oracle 11g)作为锁定机制,使用一个表来同步不同节点中的cron作业.表非常简单:

CREATE TABLE SYNCHRONIZED_CRON_JOB_TASK
(
   ID            NUMBER(10)           NOT NULL,
   CRONJOBTYPE   VARCHAR2(255 Byte),
   CREATIONDATE  TIMESTAMP(6)         NOT NULL,
   RUNNING       NUMBER(1)
);

ALTER TABLE SYNCHRONIZED_CRON_JOB_TASK
   ADD CONSTRAINT PK_SYNCHRONIZED_CRON_JOB_TASK
   PRIMARY KEY (ID); 
Run Code Online (Sandbox Code Playgroud)

因此,当作业启动时,它会在表中搜索其cronjobtype的条目,并检查它是否已在运行.如果不是,则将条目设置运行标志更新为true.第一个选择是使用JPA CriteriaApi使用Hibernate和Pessimistic Lock进行的.

query.setLockMode(javax.persistence.LockModeType.PESSIMISTIC_WRITE);
Run Code Online (Sandbox Code Playgroud)

所有这些操作都是在一次交易中完成的.

当一个进程运行时,它所做的查询如下:

[Server:server-two] 10:38:00,049 INFO  [stdout] (scheduler-2) 2015-04-30 10:38:00,048 WARN  (Loader.java:264) - HHH000444: Encountered request for locking however dialect reports that database prefers locking be done in a separate select (follow-on locking); results will be locked after initial query executes
[Server:server-two] 10:38:00,049 INFO  [stdout] (scheduler-2) Hibernate: select …
Run Code Online (Sandbox Code Playgroud)

java oracle hibernate jpa pessimistic-locking

12
推荐指数
1
解决办法
5387
查看次数

为什么Hibernate Envers忽略了我的自定义RevisionEntity?

我正在使用Spring 4.0.2开发一个使用JPA 2.1(由hibernate 4.2.11支持)的应用程序.我们使用Envers审核项目实体的变更.这工作正常.当我们尝试使用自定义修订实体作为Envers文档说:http://docs.jboss.org/hibernate/core/4.1/devguide/en-US/html/ch15.html#envers-revisionlog时出现问题

我们已经在文档中指出了一个自定义类和一个自定义监听器,但似乎Hibernate完全忽略了它们.自定义类:

@Entity
@RevisionEntity(AuditingRevisionListener.class)
public class AuditedRevisionEntity extends DefaultRevisionEntity {
  private String username;

  public String getUsername() {
    return username;
  }

  public void setUsername(String username) {
    this.username = username;
  }    
}


public class AuditingRevisionListener implements RevisionListener {
  private static Log log = LogFactory.getLog(AuditingRevisionListener.class.getName());

  @Override
  public void newRevision(Object revisionEntity) {
    AuditedRevisionEntity revEntity = (AuditedRevisionEntity) revisionEntity;
    String userName = SecurityContextHolder.getContext().getAuthentication().getName();
    revEntity.setUsername(userName);
  }

}
Run Code Online (Sandbox Code Playgroud)

就像hibernate没有考虑这个类一样,因为它应该足以让它使用注释:@RevisionEntity(AuditingRevisionListener.class).其他带注释的实体已得到很好的认可,但这只是被忽略了.我们在spring config中(我们不使用persistence.xml)在加载spring上下文时要扫描的基础包:

  <context:component-scan base-package="our.basepackage" />
Run Code Online (Sandbox Code Playgroud)

这够了吗?

我们还尝试了另一种方法.在EntityManagerFactory配置中使用此属性手动设置修订侦听器

    <prop key="org.hibernate.envers.revision_listener">our.basepackage.AuditingRevisionListener</prop>
Run Code Online (Sandbox Code Playgroud)

但是我们在newRevision方法的第一行得到了classcastexception,因为参数revisionEntity不是AuditedRevisionEntity类.再次就像没有加载AuditedRevisionEntity类.

我提出这是一个简单的问题,但我无法猜测为什么@RevisionEntity注释被忽略了.任何的想法?

java spring jpa hibernate-envers

3
推荐指数
1
解决办法
3599
查看次数