Hibernate Envers:使用复合密钥中的嵌入式类进行审核

时间:2019-02-28 10:24:11

标签: hibernate jpa composite-primary-key hibernate-envers embeddable

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

问题::实体具有组合键(@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类的解决方案,因为它在其他实体之间共享。

1 个答案:

答案 0 :(得分:0)

给出您的评论似乎是一个错误。

我认为扩展而不是合成应该起作用。

尽管JPA规范未明确要求应支持扩展Embeddable类,但Hibernate 确实支持此构造。

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

case 'f':
{
    // check for decimal, check SV if missing
    //if (*sitr == '.') {
        //++sitr;
        parse_frac_type(sitr, stream_end, frac);
        // sitr will point to next expected char after this parsing
        // is complete so no need to advance it
        use_current_char = true;
    //}
    //else {
    //    return check_special_value(sitr, stream_end, t, c);
    //}
    break;
}
case 'F':
{
    // check for decimal, skip if missing
    //if (*sitr == '.') {
        //++sitr;
        parse_frac_type(sitr, stream_end, frac);
        // sitr will point to next expected char after this parsing
        // is complete so no need to advance it
        use_current_char = true;
    //}
    //else {
    //    // nothing was parsed so we don't want to advance sitr
    //    use_current_char = true;
    //}
    break;
}