在我的项目中,某些实体应该根据其值具有签名属性。例如,在创建实体并填充其属性之后,当调用entity.saveorupdate()
方法时,hibernate事件侦听器应该接受控制并从db收集uniqueid的下一个序列值。那么同一个事件应该根据实体属性和这个uniqueid产生一个签名(比方说一个String)。签名后,应该调用真正的saveorupdate事件。因此,填充了sign属性的实体将写入数据库。
问题是,在saveorupdate事件中,我做了一些工作并调用了saveorupdate,因此会发生无休止的操作。
你对这类问题有什么解决方案吗? (而不是使用面向方面的编程)
答案 0 :(得分:0)
一个快速而肮脏的解决方案是拥有一个持有实体的ThreadLocal
。如果threadlocal为空 - 更新签名,设置threadlocal,并保存实体。在下一次调用时,将填充threadlocal,您可以从侦听器返回。
您可以做的另一件事是在实际saveOrUpdate
之前应用侦听器,如果没有ID则跳过。并在创建实体时手动调用逻辑(每个后续更新将由侦听器处理)