我正在尝试使用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
类解决方案,因为它与其他实体共享。
鉴于你的评论,它似乎是一个错误。
我认为扩展而非组合应该有效。
虽然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;
}
}