我正在尝试使用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
类的解决方案,因为它在其他实体之间共享。
答案 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;
}