【问题标题】:hibernate basics休眠基础
【发布时间】:2013-03-10 20:17:07
【问题描述】:

我正在使用 hibernate 和 spring mvc 并使用注释.. 我希望如果存在子实体,则不应删除任何父实体。 现在我可以通过代码明确地做到这一点,但是可以直接通过hibernate来完成吗,我的意思是通过配置??

其次,在春季,我会在何时(在每个 dao 中)获得 sessionFactory。为了获得会话,我使用

sessionFactory.getCurrentSession()

我应该在单例类中获取 session/sessionFactory 并在任何地方使用它吗??

我正在使用

sessionFactory.getCurrentSession().save(batch);

sessionFactory.getCurrentSession().delete(batch);

然后我不需要担心关闭和启动会话,因为它是自动完成的。对吗?

【问题讨论】:

标签: java hibernate design-patterns


【解决方案1】:
  1. 这是由您应该在数据库中拥有的外键约束来保证的。如果子节点与其父节点有外键,而您尝试删除父节点,则数据库将拒绝删除,您将收到异常。

  2. 是的,Spring 为您打开一个会话并将其关联到当前事务,并在事务结束时自动关闭它。您不应该关心打开和关闭会话。将会话工厂注入您的 DAO,并在每次需要时从该工厂获取当前会话。

【讨论】:

  • 在hibernate中添加这样的约束怎么样,我知道可以通过db级别的约束来管理,但是我认为ORM异常对性能问题很重要,对吗?有没有办法通过配置来管理它。否则我需要在删除每个实体之前为家属添加不同的检查。
  • Hibernate 不检查约束。数据库可以。这是检查它们的唯一可靠的地方。您可以在模型中添加约束注释以让 Hibernate 在数据库模式中生成它们(如果您使用模式生成)。您应该首先担心正确性,然后再考虑性能。
  • OK aggred,所以如果我添加所有这些约束,那么两种更好的实现方式是什么:1)我不应该担心 cnstraints,因为它们在 db 中,直接去调用 delete ,它将失败我可以抓住它并显示存在某些依赖关系的消息,2)即使存在数据库级别约束,我也会通过代码明确检查它并相应地显示错误......哪种方式是首选方式?如果第二种方法是首选方法,那么我应该相信没有支持检查这种依赖约束的通用方法(我的原始问题)...
  • 使用第一个选项很难给出有意义的错误消息,因为异常不会提供一种简单且可移植的方式来了解导致异常的约束。因此,如果您想要清除错误消息,请使用第二个选项。但是您需要执行查询。没有通用的检查方法。即使你没有找到任何子引用,如果另一个并发事务在检查和删除之间插入了一个子引用,删除可能仍然会失败。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-03
  • 1970-01-01
  • 2012-10-31
  • 2011-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多