有没有什么方法可以使用 hibernate-envers 审计一个在其 EmbeddedId 中具有 @Embedded 的实体
Is there any way to audit , with hibernate-envers, an entity having an @Embedded in its EmbeddedId
我有一个实体 BlocRecord,它有一个复合代码 BlocRecordId,在它的复合代码中有一个 @Embedded(关系代码 ManyToOne)指向另一个实体记录,我想审计实体 BlocRecord。
实体 BlocRecord
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@Table(name = "blocRecord")
@Access(value = AccessType.FIELD)
@Audited
public class BlocRecord {
@EmbeddedId
private BlocRecordId blocRecordId = new BlocRecordId();
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumns({
@JoinColumn(name = "record_identifier_", referencedColumnName = "identifier_", unique = false, nullable = false),
@JoinColumn(name = "record_recordType_", referencedColumnName = "recordType_", unique = false, nullable = false)})
@MapsId("record")
private Record record;
...
}
id class BlocRecordID
@Embeddable
public class BlocRecordId implements Serializable {
@Embedded
private RecordId record;
@Column(name = "source_")
String source ;
@Column(name = "messageType_")
String messageType ;
实体记录
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@Table(name = "records")
@Access(value = AccessType.FIELD)
@Audited
public class Record {
@EmbeddedId
private RecordId recordId = new RecordId();
@OneToMany(targetEntity = BlocRecord.class, fetch = FetchType.LAZY, mappedBy = "record")
private Set<BlocRecord> blocRecord = new java.util.HashSet<>();
...
}
实体记录的idClass
@Embeddable
public class RecordId implements Serializable{
@Column(name = "identifier_")
String identifier ;
@Column(name = "recordType_")
String recordType ;
}
Hibernate-envers 在尝试生成可嵌入的 BlocRecordId 中字段记录的元数据时失败,抛出流动异常
org.hibernate.MappingException: Type not supported: org.hibernate.type.ComponentType
at org.hibernate.envers.configuration.internal.metadata.IdMetadataGenerator.addIdProperties(IdMetadataGenerator.java:121)
at org.hibernate.envers.configuration.internal.metadata.IdMetadataGenerator.addId(IdMetadataGenerator.java:230)
at org.hibernate.envers.configuration.internal.metadata.AuditMetadataGenerator.generateFirstPass(AuditMetadataGenerator.java:642)
at org.hibernate.envers.configuration.internal.EntitiesConfigurator.configure(EntitiesConfigurator.java:95)
at org.hibernate.envers.boot.internal.EnversServiceImpl.doInitialize(EnversServiceImpl.java:154)
at org.hibernate.envers.boot.internal.EnversServiceImpl.initialize(EnversServiceImpl.java:118)
at org.hibernate.envers.boot.internal.AdditionalJaxbMappingProducerImpl.produceAdditionalMappings(AdditionalJaxbMappingProducerImpl.java:99)
at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:288)
at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.build(MetadataBuildingProcess.java:83)
at org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:417)
at org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:86)
at org.hibernate.boot.MetadataSources.buildMetadata(MetadataSources.java:179)
你知道如何解决这个问题吗?
谢谢
目前,当我们像您的示例所示那样映射标识符列时,Envers 不支持将可嵌入对象嵌套在可嵌入对象中的想法。 Envers 目前支持的唯一有效映射是可嵌入对象中的属性是否为 @ManyToOne
或 @Basic
类型。
您可以解决此问题,但它需要更明确一点并且不使用 RecordId
。我的意思是将 BlocRecordId
重写为以下内容:
@Embeddable
public class BlocRecordId implements Serializable {
@Column(name = "identifier_")
String identifier;
@Column(name = "recordType_")
String recordType;
@Column(name = "source_")
String source;
@Column(name = "messageType_")
String messageType;
@Transient
private RecordId recordId;
/** Helper method to assign the values from an existing RecordId */
public void setRecordId(RecordId recordId) {
this.identifier = recordId.getIdentifier();
this.recordType = recordId.getRecordType();
}
/** Helper method to get the RecordId, caching it to avoid multiple allocations */
public RecordId getRecordId() {
if ( recordId == null ) {
this.recordId = new RecordId( identifier, recordType );
}
return this.recordId;
}
}
我同意这不太理想,但它至少可以解决代码的当前限制。我已经添加并添加 HHH-13361 作为一个未解决的问题来支持这一点。如果您愿意,欢迎您做出贡献,否则我将努力为 Envers 6.0 提供支持。
我有一个实体 BlocRecord,它有一个复合代码 BlocRecordId,在它的复合代码中有一个 @Embedded(关系代码 ManyToOne)指向另一个实体记录,我想审计实体 BlocRecord。
实体 BlocRecord
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@Table(name = "blocRecord")
@Access(value = AccessType.FIELD)
@Audited
public class BlocRecord {
@EmbeddedId
private BlocRecordId blocRecordId = new BlocRecordId();
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumns({
@JoinColumn(name = "record_identifier_", referencedColumnName = "identifier_", unique = false, nullable = false),
@JoinColumn(name = "record_recordType_", referencedColumnName = "recordType_", unique = false, nullable = false)})
@MapsId("record")
private Record record;
...
}
id class BlocRecordID
@Embeddable
public class BlocRecordId implements Serializable {
@Embedded
private RecordId record;
@Column(name = "source_")
String source ;
@Column(name = "messageType_")
String messageType ;
实体记录
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@Table(name = "records")
@Access(value = AccessType.FIELD)
@Audited
public class Record {
@EmbeddedId
private RecordId recordId = new RecordId();
@OneToMany(targetEntity = BlocRecord.class, fetch = FetchType.LAZY, mappedBy = "record")
private Set<BlocRecord> blocRecord = new java.util.HashSet<>();
...
}
实体记录的idClass
@Embeddable
public class RecordId implements Serializable{
@Column(name = "identifier_")
String identifier ;
@Column(name = "recordType_")
String recordType ;
}
Hibernate-envers 在尝试生成可嵌入的 BlocRecordId 中字段记录的元数据时失败,抛出流动异常
org.hibernate.MappingException: Type not supported: org.hibernate.type.ComponentType
at org.hibernate.envers.configuration.internal.metadata.IdMetadataGenerator.addIdProperties(IdMetadataGenerator.java:121)
at org.hibernate.envers.configuration.internal.metadata.IdMetadataGenerator.addId(IdMetadataGenerator.java:230)
at org.hibernate.envers.configuration.internal.metadata.AuditMetadataGenerator.generateFirstPass(AuditMetadataGenerator.java:642)
at org.hibernate.envers.configuration.internal.EntitiesConfigurator.configure(EntitiesConfigurator.java:95)
at org.hibernate.envers.boot.internal.EnversServiceImpl.doInitialize(EnversServiceImpl.java:154)
at org.hibernate.envers.boot.internal.EnversServiceImpl.initialize(EnversServiceImpl.java:118)
at org.hibernate.envers.boot.internal.AdditionalJaxbMappingProducerImpl.produceAdditionalMappings(AdditionalJaxbMappingProducerImpl.java:99)
at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:288)
at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.build(MetadataBuildingProcess.java:83)
at org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:417)
at org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:86)
at org.hibernate.boot.MetadataSources.buildMetadata(MetadataSources.java:179)
你知道如何解决这个问题吗?
谢谢
目前,当我们像您的示例所示那样映射标识符列时,Envers 不支持将可嵌入对象嵌套在可嵌入对象中的想法。 Envers 目前支持的唯一有效映射是可嵌入对象中的属性是否为 @ManyToOne
或 @Basic
类型。
您可以解决此问题,但它需要更明确一点并且不使用 RecordId
。我的意思是将 BlocRecordId
重写为以下内容:
@Embeddable
public class BlocRecordId implements Serializable {
@Column(name = "identifier_")
String identifier;
@Column(name = "recordType_")
String recordType;
@Column(name = "source_")
String source;
@Column(name = "messageType_")
String messageType;
@Transient
private RecordId recordId;
/** Helper method to assign the values from an existing RecordId */
public void setRecordId(RecordId recordId) {
this.identifier = recordId.getIdentifier();
this.recordType = recordId.getRecordType();
}
/** Helper method to get the RecordId, caching it to avoid multiple allocations */
public RecordId getRecordId() {
if ( recordId == null ) {
this.recordId = new RecordId( identifier, recordType );
}
return this.recordId;
}
}
我同意这不太理想,但它至少可以解决代码的当前限制。我已经添加并添加 HHH-13361 作为一个未解决的问题来支持这一点。如果您愿意,欢迎您做出贡献,否则我将努力为 Envers 6.0 提供支持。