【问题标题】:Envers audits parent entity when inserting a sub-entity, but not when updatingEnvers 在插入子实体时审计父实体,但在更新时不审计
【发布时间】:2014-12-11 10:10:00
【问题描述】:

我的应用程序中有一个 Store/Clerks 类,它们通过“clerks”数据库表中的“storeId”外键关联,并与以下代码中给出的 Hibernate 注释相关:

Store.java:

@Entity
@Audited
@Table(name="stores")
Public Class Store {
    private Set<Clerks> clerks;
//....
@OneToMany(fetch = FetchType.LAZY, mappedBy = "store")
public Set<Clerks> getClerks() {
    return clerks;
}
}

文员.java:

@Entity
@Audited
@Table(name="clerks")
Public Class Clerk {        
    private Store store;
//....
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "storeId",referencedColumnName = "storeId")
public Store getStore() {
    return store;
}
}

当我插入(持久化)新 Clerk 时,Envers 在两个实体(“stores_aud”和“clerks_aud”)的审计表中创建条目。 但是,当我更新现有的 Clerk 时,它只会在“clerks_aud”表中创建一个条目。

谁能向我解释一下,为什么会这样,以及如何强制 Envers 在这两种情况下(插入和更新)表现相同?

谢谢

【问题讨论】:

    标签: java hibernate hibernate-envers


    【解决方案1】:

    当您将新的 Clerk 添加到 Store 时,Store#clerkscollection 会发生更改,这会导致 Store 的新审核条目。当Clerk发生变化时,Store的字段不会发生变化,因此不会为其生成审计条目,仅针对Clerk

    如果您还想在Clerk 更新时为Store 生成审核条目,则必须自己处理。一种常见的解决方案是在Store 上添加类似lastUpdated 的列,只要有变化,您就会更新它。

    【讨论】:

    • Hvala Pedja ;) 这很有帮助,但唯一的问题是我实际上有一个更复杂的结构,还有很多与“商店”相关的其他子实体,我有一个实体的要求保持他们自己的“lastUpdated”分开。所以,我想解决它的另一种方法是制作我自己的 Listener 类,对吧?
    • Nema na čemu :) 看看this similar thread。您的选择是有限的,您可以使用“lastUpdated”或不使用的天气取决于您的要求。为了保持隔离,也许您可​​以添加另一列,当满足某些逻辑(某些特定的子项更改等)时您会更新该列,但这对它有一种骇人听闻的感觉。
    猜你喜欢
    • 1970-01-01
    • 2015-12-14
    • 2012-08-10
    • 2011-07-10
    • 2019-11-16
    • 2019-08-20
    • 2013-08-27
    • 2012-12-05
    • 2013-06-28
    相关资源
    最近更新 更多