使用:
- 春天 3.1.2
- Spring Data JPA 1.1.0.RELEASE
- 休眠 4.1.6
- RESTEasy 2.3.5
我正在构建一个与 Oracle 数据库通信的 RESTful Web 服务平台。现在我们正在开发订阅者 API。我们的订阅者存储库对象映射到 Oracle 中的 USERS 表。对于版本控制,我们在 USERS 表上使用 ORA_ROWSCN 伪列。这是订阅者类的版本成员变量:
@Column(name = "ORA_ROWSCN", nullable = false, updatable = false, insertable = false)
@Version
@Generated(value = GenerationTime.ALWAYS)
protected long version = 0;
当我尝试执行创建订阅者请求时,我在应用程序日志中看到以下内容:
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 值,以便它可以在订阅者对象上设置版本属性。但是,这会导致此异常:
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
围绕创建订阅者的服务方法的包装器;我假设在该方法(或子方法)中运行的任何代码都可以看到临时数据库插入/更新。但从这个例外看来,或许并非如此?