我有一个表和两个具有相同表的数据库,但是一个是另一个的符号链接,并且只允许对该表进行读取。
我已经使用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吗?
从数据库加载实体的同时,您的实体很可能变得“肮脏”,并且Hibernate认为它需要存储更改。如果您的访问器(get和set方法) 未返回与 Hibernate设置的 值或引用完全相同的值 ,则会发生这种情况。
在我们的代码中,列表发生了这种情况,开发人员创建了新的列表实例,因为他们不喜欢设置器中的类型。
如果您不想更改代码,请将映射更改为字段访问。
您还可以通过将FlushMode设置为从不在会话上来防止Hibernate存储更改,但这只会隐藏真正的问题,在其他情况下仍然会发生此问题,并且会导致不必要的更新。