如何在休眠状态下仅审计超类的一部分?

小飞象

我想问问如何审计只是一个实体的超类的一部分,使用Hibernate注释,比如@AuditOverride@Audited否则后果不堪设想。现在,我正在使用休眠5.2.12版本。
我只能在sublcass中使用批注,因为超类位于其他模块中,而该模块对子模块一无所知。
超类包含一个List<Items>,我不希望它会被审核。因为当我使用one-to-many关系时,我不希望休眠状态创建审计关系表,例如entity1_aud_entity2_aud我只需要entity1_audentity2_aud表。
为了拒绝审核关系表,我发现了两种方法,但是所有方法都不完全正确:

1号 方式

我将列表变量和设置器/获取器复制到了实体(子类)。在列表变量上方,我写了@NotAudited注释。为了使该注释起作用,我access="field"hbm文件中设置了属性因此,休眠时不要使用setter和getter来访问变量,因此在数据提取期间不会设置超类的值
我也创建了要写的列表实体@AuditOverrides(value={@AuditOverride(forClass=Entity2.class), @AuditOverride(forClass=Item.class)})这些注释为列表实体创建审核表。因此,此审核方式的完整代码为:
Entity1.class(主sublcass)[休眠模块]

@AuditOverrides(value = {
        @AuditOverride(forClass = Entity1.class),
        @AuditOverride(forClass = Superclass.class, name = "list", isAudited = false)
})
public class Entity1 extends Superclass {

    @NotAudited
    private List<Item> list = new ArrayList<>();

    @Override
    public List<Item> getList() {
        return super.getList();
    }

    @Override
    public void setList(List<Item> list) {
        super.setList(list);
    }
}  

Entity1.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
    <class name="testing.Entity1" table="entity1">
        <id name="id" column="id">
            <generator class="org.hibernate.id.enhanced.SequenceStyleGenerator">
                <param name="optimizer">none</param>
                <param name="increment_size">1</param>
                <param name="sequence_name">seq_entity_main</param>
            </generator>
        </id>

        <list name="list" cascade="all" lazy="false" access="field">
            <key>
                <column name="entity1_id" index="idx_fk_enm_entity_id"/>
            </key>
            <list-index>
                <column name="list_index"
                        not-null="true"
                        default="0"/>
            </list-index>
            <one-to-many class="testing.Entity2"/>
        </list>

        <property name="other" column="other" type="string" length="50"/>
    </class>
</hibernate-mapping>  

Superclass.class [域模块]

public class Superclass extends Builder {

    private List<Item> list = new ArrayList<>();
    private String other;

    public List<Item> getList() {
        return list;
    }

    public void setList(List<Item> list) {
        this.list = list;
    }

    public String getOther() {
        return other;
    }

    public void setOther(String other) {
        this.other = other;
    }
}  

Entity2.class(列表项子类)[休眠模块]

@AuditOverrides({
        @AuditOverride(forClass = Entity2.class),
        @AuditOverride(forClass = Item.class)})
public class Entity2 extends Item {
}  

Entity2.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
    <class name="testing.Entity2" table="entity2">
        <id name="id" column="id">
            <generator class="org.hibernate.id.enhanced.SequenceStyleGenerator">
                <param name="optimizer">none</param>
                <param name="increment_size">1</param>
                <param name="sequence_name">seq_entity_list</param>
            </generator>
        </id>

        <property name="item" column="item" type="string" length="15"/>
    </class>
</hibernate-mapping>  

Item.class(列表项超类)[域模块]

public class Item extends Builder {

    private String item;

    public String getItem() {
        return item;
    }

    public void setItem(String item) {
        this.item = item;
    }
}  

结果:
在从数据库中提取数据期间,将仅设置entity1列表。由于access="field"在hbm文件中,超类列表将为null

2号 方式

我删除了access="field"属性,仅开始使用@AuditOverride批注。
如果我把一切都保留在第一。方式,只需删除access实体类中的属性和列表,超类将完全不会被审核。因此审核表字段将为空。
如果我添加其他内容@AuditOverride(forClass=Superclass.class),则将审核所有超类,包括列表在内的所有超类也将被@AuditOverride(forClass=Superclass.class, name="list", isAudited=false)编写。所以我只尝试修改:

Entity1.class(s​​ublcass)[休眠模块]

/* @AuditOverrides(value = {
        @AuditOverride(forClass = Entity1.class),
        @AuditOverride(forClass = Superclass.class, name = "other", isAudited = true),
        @AuditOverride(forClass = Superclass.class, name = "list", isAudited = false)
* OR */
@AuditOverrides(value = {
        @AuditOverride(forClass = Entity1.class),
        @AuditOverride(forClass = Superclass.class),
        @AuditOverride(forClass = Superclass.class, name = "list", isAudited = false)
})
public class Entity1 extends Superclass {
}  

有两个选项,并且两个都有相同的结果。
结果:
超类已审计,但列表也将被审计。因此,这意味着将创建审核关系船(entity1_aud_entity2_aud)。

结论

1号。方法不是在数据提取期间将数据设置为超类。第二。方式-审核所有超类,而我只需要对其一部分进行审核。因此,问题将是:
还有其他方法可以在子类中使用批注并仅审核超类的一部分吗?

(请务必在回答之前阅读所有问题信息)
谢谢

纳罗斯:

根据您的问题,您应该能够如下注释您的实体:

@Entity
@Audited
@AuditOverrides({
  @AuditOverride(forClass = SuperClass.class, isAudited = true),
  @AuditOverride(forClass = SuperClass.class, name = "list", isAudited = false)
})
public class Entity1 extends SuperClass {
  // just put your entity1 attributes here, no need to duplicate anything
}

@Entity
@Audited
@AuditOverride(forClass = Item.class, isAudited = true)
public class Entity2 extends Item {
  // just put your entity2 attributes here, no need to duplicate anything
}

我只使用了@AuditOverride/ @AuditOverrides批注来控制超级类型及其属性的审核,并@Audited表示应审核实体类型。

我还将说明Entity1如何在需要审核大多数属性并排除子集或相反的情况下如何混合各种替代。

最终结果是您的Entity1_AUD表将包含您的所有属性,Entity1并且还将包括您的SuperClass类中除list属性之外的所有属性。您的Entity2_AUD表将包含Entity2和超类的所有属性Item此外,将没有审核之间的连接表Entity1Entity2list

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章