Spring / JPA / Hibernate事务管理问题

时间:2013-02-19 19:36:53

标签: spring hibernate jpa transactions

使用:

  • Spring 3.1.2
  • Spring Data JPA 1.1.0.RELEASE
  • Hibernate 4.1.6
  • RESTEasy 2.3.5

我正在构建一个与Oracle数据库通信的RESTful Web服务平台。现在我们正在开发订阅者API。我们的Subscriber存储库对象映射到Oracle中的USERS表。对于版本控制,我们在USERS表上使用ORA_ROWSCN伪列。这是Subscriber类上的版本成员变量:

@Column(name = "ORA_ROWSCN", nullable = false, updatable = false, insertable = false)
@Version
@Generated(value = GenerationTime.ALWAYS)
protected long version = 0;

当我尝试执行Create Subscriber请求时,我在应用程序日志中看到以下内容:

Hibernate: select USERIDSEQUENCE.nextval from dual
Hibernate: insert into USERS (...[snip]...) values (...[snip]...)
Hibernate: select subscriber_.ORA_ROWSCN as ORA19_5_ from USERS subscriber_ where subscriber_.id=?

前两行显然是Hibernate插入新的USERS记录;可能第三行是Hibernate试图为新行加载ORA_ROWSCN值,以便它可以在Subscriber对象上设置version属性。但是,这导致了这个例外:

org.springframework.orm.hibernate3.HibernateSystemException: Null value was assigned to a property of primitive type setter of com.mycompany.webservices.model.Subscriber.version;
nested exception is org.hibernate.PropertyAccessException: Null value was assigned to a property of primitive type setter of com.mycompany.webservices.model.Subscriber.version

我认为这意味着选择ORA_ROWSCN值的尝试没有返回任何内容。那为什么会这样?我有一个围绕创建订阅者的服务方法的@Transactional包装器;我假设在该方法(或子方法)中运行的任何代码都可以看到临时数据库插入/更新。但是从这个例外情况来看,似乎情况并非如此?

0 个答案:

没有答案