Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring/JPA/Hibernate事务管理问题_Spring_Hibernate_Jpa_Transactions - Fatal编程技术网

Spring/JPA/Hibernate事务管理问题

Spring/JPA/Hibernate事务管理问题,spring,hibernate,jpa,transactions,Spring,Hibernate,Jpa,Transactions,使用: 春季3.1.2 Spring数据JPA 1.1.0.0版本 休眠4.1.6 RESTEasy 2.3.5 我正在构建一个与Oracle数据库对话的RESTfulWebServices平台。现在我们正在开发订户API。订户存储库对象映射到Oracle中的用户表。对于版本控制,我们使用USERS表上的ORA_ROWSCN伪列。以下是订阅服务器类上的版本成员变量: @Column(name = "ORA_ROWSCN", nullable = false, updatable = false,

使用:

春季3.1.2 Spring数据JPA 1.1.0.0版本 休眠4.1.6 RESTEasy 2.3.5 我正在构建一个与Oracle数据库对话的RESTfulWebServices平台。现在我们正在开发订户API。订户存储库对象映射到Oracle中的用户表。对于版本控制,我们使用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插入新用户记录;第三行可能是Hibernate,它试图为新行加载ORA_ROWSCN值,以便在订户对象上设置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包装器;我假设在该方法或子方法中运行的任何代码都可以看到临时数据库插入/更新。但从这个例外情况来看,似乎情况并非如此?

作为测试,我尝试将版本成员变量从long改为long。创建请求成功。然后我尝试了一个更新请求,当Spring JpaTransactionManager尝试提交事务时,会导致org.hibernate.StaleObjectStateException。服务层更新方法具有@Transactional注释。我认为这个StaleObjectStateException可能与原始的org.hibernate.propertyAccesseException具有相同的根本原因,即代码没有看到更新的ORA_ROWSCN值,该值是由用户表的更新产生的。您说您在服务方法周围有@Transactional注释。您如何调用服务方法?来自同一类中的另一个方法或来自服务类之外的方法?@kabram来自服务类之外的方法;具体来说,从我们控制器层的一个类中。我发现了一些在线论坛帖子,这些帖子让我相信Hibernate的2级缓存和使用ORA_ROWSCN作为版本列可能存在兼容性问题,包括和。好的,我认为问题在于,在执行提交之前,Oracle不会为新插入或更新的行设置ORA_ROWSCN值。显然,在这种情况下,在我的事务完成之前没有提交。