Pon*_*oni 6 java testing persistence hibernate
我有一个应用程序,我想测试防止与Hibernate和/或持久性相关的可能问题.
还有什么问题?我如何重现它们(字面意思)?你怎么从他们身上恢复过来?
为了说清楚:我在谈论多线程集群环境(最复杂的环境).
我的唯一:
org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect)
复制:
处理:不确定......
延迟加载是您将遇到的一个重大问题,特别是如果您遵循标准的DAO模式.你最终会得到延迟加载的集合,但是当你从DAO层出来时,spring(或者你没有使用spring的其他东西)可能会关闭会话.
public class MyDaoImpl implements MyDao {
@Override
@Transactional
public void save(MyObject object) { ... }
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,当"保存"调用完成时,如果您不在另一个事务中,则spring将关闭您的会话.因此,对延迟加载的对象的任何调用都将抛出LazyInitializationException.
处理此问题的典型方法是将会话绑定到当前线程.在webapps中,您可以使用OpenSessionInViewFilter轻松完成此操作.对于命令行,您可能需要编写一个实用程序方法来创建会话,绑定到当前线程,然后在完成后解除绑定.您可以在网络上找到这方面的示例.
关于集合的主题,如果你使用"更新"方法(你通常用标准DAO模式做的事情),你必须小心不要替换集合实例,而是你应该操纵已经集合的到位.否则,hibernate将很难确定需要添加/删除/更新的内容.
| 归档时间: |
|
| 查看次数: |
12060 次 |
| 最近记录: |