假设这段Hiberante代码:
session.beginTransaction();
Event event1 = session.load(1);
Event event2 = new Event(2);
event2.setNextEvent(event1);
event2.save();
session.getTransaction().commit();
我的问题是,这是否按预期工作?也就是说,我可以从数据库中读取内容,将其设置在另一个实体上,然后在单个事务中将该实体保存到数据库中吗?
换句话说,开始事务意味着“我将收集所有查询到数据库,并保持它们,直到你告诉我提交它们。” orr确实开始真正意味着锁定和提交意味着解锁?
答案 0 :(得分:2)
我已多次阅读你的例子,我看不到你在说什么。代码中没有任何更改或提交,也没有指示等待提交的内容,而不是什么。如果这个代码是在一个典型的系统中使用了一个ORM,比如hibernate,那么我就可以看到它没有问题。
假设a
尚未提交到数据库,那么dao.findBar(a)
仍将返回它,因为它将在休眠缓存中。假设它首先与冬眠会议有关。
dao.findBar(a)
应该返回x
,前提是它符合与a
相同的条件。即它已经存在或已与休眠会话相关联。
因此,dao.findBar(x.getBaz())
也应该假设同样的东西。
正如你所看到的,在上述陈述中有很多“大概是”。我怀疑如果没有更明确的问题,你会得到更好的答案。
更复杂的是你的问题没有提到ORM,但你在评论中谈到它们。因此我的评论假设这种情况。如果您没有使用ORM并且您的dao直接通过JDBC访问数据库,则答案将再次完全不同 - 取决于dao的内部编码。