首页 > 解决方案 > 如何创建一个拦截器,在达到预定义的记录限制后删除插入时的旧记录(LIFO)?

问题描述

休眠问题

我想确保每个 UID 最多有 X 条记录(非唯一)。

当达到限制时,我希望休眠在插入新记录之前/之后删除“最后进入”记录。

表示例: 消息

UID| ID | MESSAGE
YY    1       "1"
YY    2       "2"

例如:对于 UID 的 2 条消息的限制,一条新消息“3”将删除消息“1”,因此该表以相同“YY”UID 的 2 条消息结束。

预期结果:

UID| ID | MESSAGE
YY    2       "2"
YY    3       "3"

标签: javahibernatespring-data-jpa

解决方案


PostPersist 您可以在休眠中使用JPA 实体侦听器,该侦听器在持久化您的实体实例时起作用。然后实体侦听器查询并删除超出限制的实例。

由于您已标记spring-data-jpa,因此您还可以在阶段中使用 a TransactionalEventListenerin spring(请参阅事务绑定事件BEFORE_COMMIT,它与实体侦听器执行相同的操作。

不同之处在于,事务事件侦听器在每个事务中只会被调用一次,而实体侦听器可以被多次调用,具体取决于您在每个事务中保留的实例数。


推荐阅读