gpt4 book ai didi

java - Hibernate 将对象保存到多个 session

转载 作者:搜寻专家 更新时间:2023-10-30 21:10:37 24 4
gpt4 key购买 nike

我正在尝试使用 hibernate 写入多个数据库。我已将写和读/写 session 封装在单个 session 对象中。然而,当我去保存时,我得到了很多错误,这些对象已经与另一个 session 相关联:“非法尝试将一个集合与两个打开的 session 相关联”

这是我的代码:

public class MultiSessionObject implements Session {

private Session writeOnlySession;
private Session readWriteSession;

@Override
public void saveOrUpdate(Object arg0) throws HibernateException {
readWriteSession.saveOrUpdate(arg0);
writeOnlySession.saveOrUpdate(arg0);
}
}

我试过驱逐对象并冲洗;然而,这会导致“行已被另一个事务更新或删除”的问题......即使两个 session 都指向不同的数据库。

public class MultiSessionObject implements Session {

private Session writeOnlySession;
private Session readWriteSession;

@Override
public void saveOrUpdate(Object arg0) throws HibernateException {
readWriteSession.saveOrUpdate(arg0);
readWriteSession.flush();
readWriteSession.evict(arg0);

writeOnlySession.saveOrUpdate(arg0);
writeOnlySession.flush();
writeOnlySession.evict(arg0);
}
}

除上述之外,我还尝试使用 hibernate 的复制功能。这也是没有错误的不成功。

有没有人成功地将一个对象保存到两个具有相同模式的数据库中?

最佳答案

saveOrUpdate 尝试将给定的实体重新附加到当前运行的 session ,因此代理(LAZY 关联)绑定(bind)到 Hibernate session 。尝试使用 merge instead of saveOrUpdate ,因为 merge 只是将分离的实体状态复制到新检索的托管实体。这样,提供的参数永远不会附加到 session 。

另一个问题是事务管理。如果您使用线程绑定(bind)事务,那么如果您想从同一个线程更新两个数据源,则需要两个显式事务。

也尝试明确设置事务边界:

public class MultiSessionObject implements Session {

private Session writeOnlySession;
private Session readWriteSession;

@Override
public void saveOrUpdate(Object arg0) throws HibernateException {

Transaction readWriteSessionTx = null;
try {
readWriteSessionTx = readWriteSession.beginTransaction();
readWriteSession.merge(arg0);
readWriteSessionTx.commit();
} catch (RuntimeException e) {
if ( readWriteSessionTx != null && readWriteSessionTx.isActive() )
readWriteSessionTx.rollback();
throw e;
}

Transaction writeOnlySessionTx = null;
try {
writeOnlySessionTx = writeOnlySession.beginTransaction();
writeOnlySession.merge(arg0);
writeOnlySessionTx.commit();
} catch (RuntimeException e) {
if ( writeOnlySessionTx != null && writeOnlySessionTx.isActive() )
writeOnlySessionTx.rollback();
throw e;
}
}
}

关于java - Hibernate 将对象保存到多个 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29500182/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com