使用:
我正在构建一个与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
包装器;我假设在该方法(或子方法)中运行的任何代码都可以看到临时数据库插入/更新。但是从这个例外情况来看,似乎情况并非如此?