我有一个Spring Boot应用程序,其中包含许多通过JPA注释配置的实体。对于特定类型的新实体,我运行几个查询,以根据日期字段确定旧条目是否存在。这部分工作得很好。但是,我没有在目标对象的任何时刻对存储库调用save()。当select查询正在执行时,似乎是自动刷新...
2014-11-06 12:05:46.617 DEBUG 5070 [clientInboundChannel-10] --- org.hibernate.engine.spi.ActionQueue     : Executing identity-insert immediatel
2014-11-06 12:05:52.647 DEBUG 5070 --- [boundChannel-10] org.hibernate.SQL                        : insert into target_object_table... 
2014-11-06 12:05:52.647 DEBUG 5070 [clientInboundChannel-10] --- org.hibernate.SQL                        : insert into ftarget_object_table...问题是,因为我没有启动这个刷新,所以我的对象版本的ID仍然是0。因此,稍后在@Transaction中,我调用repository.save(targetObject)并在数据库中保存了两个。
通过google搜索,似乎有两件事可以解决这个问题,但我不是100%确定如何使用"spring-boot“/ "jpa”来配置它们。
1)我猜是因为我的对象有@Entity表示法,所以它会在实例化时自动附加。有什么简单的方法可以防止这种情况发生吗?我必须显式调用实体管理器上的detach()吗?
2)是否有一个application.properties设置将刷新模式更改为commit,或者在带注释的@Query上有一个选项来更改每个查询级别的commit模式?
发布于 2014-11-07 22:42:16
因此,经过一些深入的调查和在Hibernate插入代码中设置断点之后,我确定确实有两个有效的请求同时进入。这不是我期望的web应用层的行为,所以当我问这个问题时,我没有走上这条调试路线。因为我的事务没有被配置为锁定读取,所以两个事务方法都可以在DB中检查某个日期的现有条目(不能找到它,然后执行插入操作)。在修复了web层(这是一个AngularJS问题)之后,这个问题就消失了。
发布于 2014-11-07 02:54:47
第一个问题)
我猜是因为我的对象有@Entity表示法,所以它会在实例化时自动附加。
这是错误的,当您创建一个由@Entity注释的新类时,它不会自动成为JPA(Hibernate)实体。+你需要调用EntityManager.persist (或者一些Spring-Data-JPA函数)来使它成为一个JPA(Hibernate)实体。
https://stackoverflow.com/questions/26786541
复制相似问题