【问题标题】:hibernate spring: PrePersist the place for business-logic?hibernate spring:PrePersist 是业务逻辑的地方吗?
【发布时间】:2011-05-01 09:26:40
【问题描述】:

我正在使用 Spring + Hibernate 在 MySQL 数据库中创建和存储记录。

就在保留记录之前,我希望我的系统生成一个随机字符串,该字符串将存储在正在存储的实体的字段中。这个随机字符串稍后将用作访问密钥来检索记录并确认用户的输入。

我想在我的实体类中使用带有@PrePersist 注释的方法来实现这种行为。这是放置这种方法的合适位置吗?

这个问题出现在我身上,因为我不知道如何检查数据库表中随机字符串的唯一性,因为我想不出一种方法来引用 spring 的 HibernateTemplate 实例来从实体类中进行查询。

非常感谢任何建议。

【问题讨论】:

  • @PrePersist 是 JPA,而不是休眠。如果你使用 JPA,你应该使用 JpaTemplate,而不是 HibernateTemplate。
  • 感谢 Seanizer,我是 Hibernate 和 JPA 的新手。我在 Hibernate 文档中找到了 PrePersist 注释,但您可能正确地使用 JpaTemplate 而不是 HibernateTemplate。但是实体类是否是做我想做的事情的合适位置,我如何能够从该类中检查生成的列值的唯一性?

标签: hibernate spring entity business-logic


【解决方案1】:

就在保留记录之前,我希望我的系统生成一个随机字符串,该字符串将存储在正在存储的实体的字段中。

PrePersist 生命周期回调方法确实非常适合这个用例。

这个问题出现在我身上,因为我不知道如何检查数据库表中随机字符串的唯一性,因为我想不出一种方法来引用 spring 的 HibernateTemplate 实例来从实体类中进行查询。

HibernateTemplate / JpaTemplate 与否,实际上没有办法在不锁定整个表的情况下使用 SQL 查询(至少不是以 100% 确定的方式)检查值的唯一性,你可能不会不想那样。如果没有锁定整个表,您可能会面临竞争条件:当线程 T1 执行选择时,线程 T2 可能会插入 T1 未找到并首先提交的值,导致随后从 T1 插入失败.

换句话说,保证唯一性或列的唯一方法是插入记录并提交事务(数据库可以使用延迟约束检查,因此需要提交)。

【讨论】:

  • 感谢您的想法。事实上,我不想锁定桌子。因此,如果我对您的理解正确,我将需要尝试保留记录并让数据库检查列中字段值的唯一性并捕获数据库可能抛出的错误。对吗?
  • @Baris 是的,就是这样。
猜你喜欢
  • 1970-01-01
  • 2012-05-04
  • 1970-01-01
  • 2012-06-22
  • 2011-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-09
相关资源
最近更新 更多