2010-10-27 63 views
1

我使用Spring + Hibernate在MySQL数据库中创建和存储记录。hibernate spring:PrePersist商业逻辑的地方?

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

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

这个问题发生在我身上,因为我不知道如何检查数据库表的唯一性的随机字符串,因为我想不到一种方法来引用春天的HibernateTemplate实例做实体类内的查询。

任何建议,非常感谢。

+0

@PrePersist是JPA,而不是休眠。如果你使用JPA,你应该使用JpaTemplate而不是HibernateTemplate。 – 2010-10-27 15:32:07

+0

感谢Seanizer,我是Hibernate和JPA的新手。我在Hibernate文档中找到了PrePersist注释,但是您可能正确使用JpaTemplate而不是HibernateTemplate。 但是,实体类是做我想做的事情的适当位置,我将如何能够从该类内检查我生成的列值的唯一性? – Baris 2010-10-27 15:58:40

回答

0

就在坚持记录之前,我希望我的系统能够生成一个随机字符串,它将存储在存储实体的字段中。

A PrePersist生命周期回调方法对于这种用例来说确实是完美的。

这个问题发生在我,因为我不知道如何检查数据库表中的随机字符串的唯一性,因为我不能想办法从内部参考春天的HibernateTemplate的情况下做一个查询实体类。

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

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

+0

感谢您的想法。事实上,我不想锁定桌子。因此,如果我理解正确,我需要尝试持续记录,并让数据库检查列中字段值的唯一性并捕获数据库可能抛出的错误。那是对的吗? – Baris 2010-10-28 14:35:16

+0

@巴黎是的,就是这样。 – 2010-10-28 14:38:40