Hibernate中的对象关系映射 - "Sessionbound"是什么意思?

3

我目前正在尝试使用Hibernate,但不幸的是我不太明白什么是“sessionbound”。

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

"Sessionbound"指的是对象与当前会话相关联。当一个对象被保存到数据库中时,它将成为一个持久化对象,并与当前会话相关联。这意味着在同一会话期间,您可以对该对象进行更改并在提交更改之前保留这些更改。但是,如果会话结束,则该对象将不再与任何会话相关联,并且必须重新获取才能进行更改。

2个回答

4
Hibernate中的Session与事务密切相关,同时也充当一级缓存。每次读取或存储对象时,它会自动绑定到当前Session(因此放置在L1缓存中)。
最重要的是,只要对象绑定到Session:
- 您可以利用关系的延迟加载(否则将获得可怕的LazyInitializationException)。 - 从那时起对该对象进行的所有更改都将自动传递到底层数据库。只要对象绑定到Session,就无需手动持久化它。

1
请注意,当使用类似于Spring中的事务管理层时,通常情况下,当最外层的事务提交时,您的会话将被关闭。
public class MyRep implements Rep {
   @Transactional
   public MyObject findMyObject(..) { ... }
}

因此,当你在Spring中激活事务管理,并假设你尚未处于事务中时,如果你执行以下操作:

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

当这个方法完成时,您的对象不再绑定到会话上(因为Spring已经关闭了您的会话)。有一些方法可以克服这个问题,但我不会在这里详细介绍,只是想让您知道。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接