一尘不染

在只读同义词上禁用刷新时的Hibernate自动更新

hibernate

我有一个表和两个具有相同表的数据库,但是一个是另一个的符号链接,并且只允许对该表进行读取。

我已经使用Hibernate将表映射到Java,并使用spring根据某些输入条件将实体管理器的数据源设置为两个数据库之一。

当我连接到第二个数据库时,我仅调用只读操作(选择),但是Hibernate似乎试图将某些内容刷新回数据库,并且它无法告诉该视图不允许更新。

如何仅对第二个数据源禁用此更新,并使第一个数据源保持正常?

更新:查看堆栈跟踪,刷新似乎在这里开始:

          在org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321)
          在org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50)
          在org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1027)
          在org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:365)
          在org.hibernate.ejb.AbstractEntityManagerImpl $ 1.beforeCompletion(AbstractEntityManagerImpl.java:504)
          ...更多55

这与hibernate.transaction.flush_before_completion属性有关吗?我可以为第二个数据源将其设置为false吗?


阅读 237

收藏
2020-06-20

共1个答案

一尘不染

从数据库加载实体的同时,您的实体很可能变得“肮脏”,并且Hibernate认为它需要存储更改。如果您的访问器(get和set方法) 未返回与
Hibernate设置的 值或引用完全相同的值 ,则会发生这种情况。

在我们的代码中,列表发生了这种情况,开发人员创建了新的列表实例,因为他们不喜欢设置器中的类型。

如果您不想更改代码,请将映射更改为字段访问。

您还可以通过将FlushMode设置为从不在会话上来防止Hibernate存储更改,但这只会隐藏真正的问题,在其他情况下仍然会发生此问题,并且会导致不必要的更新。

2020-06-20