使用:
- 春3.1.2
- Spring Data JPA 1.1.0.RELEASE
- Hibernate 4.1.6
- RESTEasy 2.3.5
Oracleデータベースと通信するRESTfulWebサービスプラットフォームを構築しています。現在、サブスクライバー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=?
最初の2行は、明らかにHibernateが新しいUSERSレコードを挿入しています。おそらく3行目は、Hibernateが新しい行のORA_ROWSCN値をロードして、Subscriberオブジェクトにバージョン属性を設定できるようにしようとしていることです。ただし、その結果、次の例外が発生します。
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
サブスクライバーを作成するサービスメソッドのラッパーがあります。そのメソッド(またはサブメソッド)で実行されているコードはすべて、暫定的なデータベースの挿入/更新を確認できると思います。しかし、この例外から、おそらくそうではないように見えますか?