hibernate spring:为业务逻辑做准备?
我正在使用Spring+Hibernate在MySQL数据库中创建和存储记录 在持久化记录之前,我希望我的系统生成一个随机字符串,该字符串将存储在正在存储的实体的字段中。这个随机字符串稍后将用作检索记录和确认用户输入的访问键 我想在我的实体类中使用@PrePersist注释的方法来实现这种行为。这是放置这种方法的适当位置吗 我遇到了这个问题,因为我不知道如何检查数据库表中随机字符串的唯一性,因为我想不出一种方法来引用spring的HibernateTemplate实例从entity类中执行查询 任何建议都将不胜感激 在持久化记录之前,我希望我的系统生成一个随机字符串,该字符串将存储在正在存储的实体的字段中hibernate spring:为业务逻辑做准备?,hibernate,spring,entity,business-logic,Hibernate,Spring,Entity,Business Logic,我正在使用Spring+Hibernate在MySQL数据库中创建和存储记录 在持久化记录之前,我希望我的系统生成一个随机字符串,该字符串将存储在正在存储的实体的字段中。这个随机字符串稍后将用作检索记录和确认用户输入的访问键 我想在我的实体类中使用@PrePersist注释的方法来实现这种行为。这是放置这种方法的适当位置吗 我遇到了这个问题,因为我不知道如何检查数据库表中随机字符串的唯一性,因为我想不出一种方法来引用spring的HibernateTemplate实例从entity类中执行查询
PrePersist
生命周期回调方法确实非常适合这个用例
我遇到了这个问题,因为我不知道如何检查数据库表中随机字符串的唯一性,因为我想不出一种方法来引用spring的HibernateTemplate实例从entity类中执行查询
HibernateTemplate
/JpaTemplate
,实际上,如果不锁定整个表,就无法使用SQL查询(至少不是以100%确定的方式)检查值的唯一性,您可能不希望这样。如果没有对整个表的锁定,您可能会面临争用条件:当线程T1将执行select时,线程T2可能会插入T1未找到并首先提交的值,从而导致T1的后续插入失败
换句话说,保证唯一性或列的唯一方法是插入记录并提交事务(数据库可以使用延迟约束检查,因此需要提交)。@PrePersist是JPA,而不是hibernate。如果您使用JPA,您应该使用JpaTemplate,而不是HibernateTemplate。感谢Seanizer,我对Hibernate和JPA是新手。我在Hibernate文档中找到了PrePersist注释,但是您使用JpaTemplate而不是HibernateTemplate可能是正确的。但是实体类是否是我想做的事情的适当位置,以及如何从该类中检查生成的列值的唯一性?谢谢您的想法。事实上,我不想把桌子锁上。因此,如果我理解正确,我需要尝试持久化记录,例如,让数据库检查列中字段值的唯一性,并捕获数据库可能抛出的错误。“对吗?”巴里斯是的,没错。