3

我目前正在尝试使用 Hibernate 迈出第一步,但不幸的是,我并没有真正理解“会话绑定”的含义。

假设我有一个瞬态对象。一旦它被持久化,它不仅有一个 ID,而且是“会话绑定的”。但为什么值得一提?

4

2 回答 2

4

Hibernate 中的 Session 与事务密切相关,也作为一级缓存。每次读取或存储对象时,它都会自动绑定到当前会话(因此放置在 L1 缓存中)。

最重要的是,只要一个对象绑定到会话:

  • 你可以利用延迟加载关系(否则你会得到可怕的LazyInitializationException)。

  • 从那一刻起对该对象的所有更改都将自动填充到基础数据库中。只要对象绑定到会话,就不需要手动持久化。

于 2012-05-20T20:00:55.670 回答
1

还要记住,当使用像 spring 中那样的事务管理层时,当你的最外层事务被提交时,你的会话通常会消失:

public class MyRep implements Rep {
   @Transactional
   public MyObject findMyObject(..) { ... }
}

因此,当您在 spring 中激活事务管理时,假设您尚未参与事务,如果您这样做:

MyObject o = rep.findMyObject(...);

到此方法完成时,您的对象不再绑定到会话(因为 spring 已关闭您的会话)。有办法克服这个问题,但我不会在这里讨论,只是想让你知道。

于 2012-05-21T01:26:31.713 回答