Hibernate Envers:使用Composite Key中的Embedded类进行审计

问题描述 投票:0回答:1

我正在尝试使用Hibernate Envers激活对JPA实体的审核(当前版本:5.4.1.Final)。

问题:实体有一个复合键(@EmbeddedId),键类本身有一个@Embedded类。我没有让@Audit工作。

问题:这里导致问题的原因是什么,您能建议解决方案/解决方法吗?

示例:数据库在所有表中使用公共数据空间的概念。表item可能有列:dataspace1, dataspace2, dataspace3, itemid, value1, value2, ...。当然,Hibernate Envers正如预期的那样存在审计表item_aud

我有以下课程:

@Entity
@Table(name = "item")
@Audited
public class Item {
    @EmbeddedId 
    private ItemKey itemKey;

    @Column(name = "value1")
    private String value1;

    @Column(name = "value2")
    private String value2;
    ...
}    

@Embeddable
public class ItemKey {
    @Embedded 
    private DataSpace dataSpace;

    @Column(name = "itemid")
    private String itemId;
}

@Embeddable
public class DataSpace {
    @Column(name = "dataspace1")
    private String dataSpace1;

    @Column(name = "dataspace2")
    private String dataSpace2;

    @Column(name = "dataspace3")
    private String dataSpace3;
}

有了这个设置,我得到一个例外:org.hibernate.MappingException: Type not supported: org.hibernate.type.ComponentType

@Audit停用时,保存/加载实体正常工作。当我将三个DataSpace属性平放到ItemKey时,它也有效。尽管如此,我们更倾向于使用单独的DataSpace类解决方案,因为它与其他实体共享。

hibernate jpa composite-primary-key hibernate-envers embeddable
1个回答
0
投票

鉴于你的评论,它似乎是一个错误。

我认为扩展而非组合应该有效。

虽然JPA规范没有明确规定应该支持扩展Embeddable类,但Hibernate确实支持这种构造。

您还应该能够保留get / set方法,因此不需要更改客户端代码。

@MappedSuperclass
@Embeddable
public class DataSpace {
    @Column(name = "dataspace1")
    private String dataSpace1;

    @Column(name = "dataspace2")
    private String dataSpace2;

    @Column(name = "dataspace3")
    private String dataSpace3;
}

@Embeddable
public class ItemKey extends DataSpace {

    @Column(name = "itemkey")
    private String itemKey;

    public void setDataSpace(DataSpace dataSpace){
        //copy to the inherited fields
    }

    public DataSpace getDataSpace(){
        DataSpace dataSpace = new DataSpace();
        //populate form the inherited fields

        return dataSpace;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.