正如我之前的帖子所证明的那样,我正在改进内存中、网络缓存的性能,以适应曾经完全 hibernate 的场景。在这样做的过程中,我遇到了处理代理对象和需要重新连接到 session 的问题,但在这样做的过程中,我还想保持可交易性。将复杂逻辑移出 hibernate 层的最佳实践是什么?我刚刚“完全”进入 hibernate 状态,所以这是一个相当可恶的经历。
任何从事此类数据移动工作的人都可以详细说明您是如何克服事务问题、处理代理对象等的吗?我现在正在寻找一般资源,因为我正在努力游泳。
谢谢。
最佳答案
您需要决定两件事:
- 您的 session 管理策略
- 您的相关抓取策略
有好的post由 Gavin King 撰写,解释了处理 session 的一些选项(这篇文章是关于性能的,但也普遍适用)。
至于获取,需要考虑的一件事是增加 Hibernate 层提供的原语数量。例如。假设您有一个与 Bar 具有 1-N 关系的实体 Foo,在某些情况下您只需要 Foo 对象,但在其他情况下您需要 Foos 和子 Bar 对象。您可以将它们表示为对 Hibernate 层的单独调用。
class HibernateLayer {
public List<Foo> findFoo(String someCriteria) {
Query q = new Query("from Foo f where f.someCriteria = :1");
//...
}
public List<Foo> findFooWithBars(String someCriteria) {
Query q = new Query("from Foo f left join fetch Bar b where f.someCriteria = :1");
//...
}
这有 2 个好处,1 你不会处理延迟加载的代理对象,你将拥有你需要的所有数据并且它会执行得更好,因为生成的 SQL 将更适合这种情况。然而,它有一个缺点,即在调用 Hibernate 层之前,您需要知道您是否需要更深层次的数据。为确保您的数据保持一致(交易的主要目的),请确保使用 optimistic locking至少。
关于java - 将数据从 hibernate 层提取到另一层的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/898121/