hibernate侦听器Map的表数据不正确

bxgwgixi  于 2021-08-20  发布在  Java
关注(0)|答案(0)|浏览(150)

我有一个使用联接表的多个Map。

@Entity
@EntityListeners(AuditingEntityListener.class)
@Table(name = "access_management")
public class AccessMgmt
    extends CommonColumns
    implements Serializable {

@ManyToMany(cascade = CascadeType.PERSIST, fetch = FetchType.EAGER)
@JoinTable(
        name = "access_management_role_mapping",
        joinColumns = @JoinColumn(name = "access_management_id"),
        inverseJoinColumns = @JoinColumn(name = "roles_id"))
@CsvBindByName(column = "roles")
private List<Role> roles = new ArrayList<>();

}

当数据被更新(onflushdirty)时,许多字段的previousstate和currentstate包含完全相同的数据(这是只应处于currentstate的字段)。我认为joinMap表有问题,因为我没有这个表的实体(access\u management\u role\u mapping),它正在更新并且没有命中拦截器,然后父对象(access\u management)在更新后命中拦截器。这只是一种怀疑,但它是这样的,因为非审计日志表中的所有数据都是正确的。

public class AuditLogInterceptor extends EmptyInterceptor {

@Override
public boolean onFlushDirty(
        final Object entity, final Serializable id,
        final Object[] currentState, final Object[] previousState,
        final String[] propertyNames, final Type[] types) {
... }
}

第二个问题是,我真的只希望“父”实体命中拦截器,并使其previousstate和currentstate为“正确”对象命中自定义拦截器。我所说的“正确”是指将具有Map的完整对象设置为previousstate和currentstate,currentstate在当前设置中始终是正确的。当前,具有onetomanyMap的表中的每个实体都会单独命中拦截器,这很好,但最终父对象(用户保存/编辑的对象)会最后命中拦截器,并且任何Map字段(oneto.)的前一状态的数据都不正确。。许多。。ect)
我可以添加更多的代码,但我认为大部分代码都是不必要的。
我想我可以通过做一些事情来解决这个问题。
使用envars…-(不,谢谢,这将意味着完全重写这一部分。)
将manytomany更改为onetomany,并将Map表创建为一个实体,并在拦截器中处理它(如果我也有,但不能解决我的第二个问题)
添加父对象的 transient 以使用@preload保存以前的状态,以便我始终具有以前的状态(这解决了这两个问题,但似乎是一件很奇怪的事情,但如果这里的人没有更好的想法,我会怎么做。)(如何获取previousestate而不使用hibernate拦截器从db获取来创建审计跟踪表?)
更新
选项3没有按照我的预期工作,也没有得到我当时想要的数据。那就结束了。
我还尝试使用hibernate事件监听器而不是拦截器,结果相同。
最终,我可能需要在根本不使用hibernate的情况下实现它,并在控制器级别执行它。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题