[英]Composite table with Hibernate Envers
我有一個應用程序,其中的復合表包含一個額外的列。 一切正常,直到我們添加了Hibernate Envers(@Audited)。
org.hibernate.MappingException:無法讀取no.pack.response.ResponseDomainCode中responseDomainCodes的按屬性映射
如果有必要,我很樂意提供更詳細的信息,但是,目前我不確定什么是相關的。
這些表看起來像這樣,並且是一個非常標准的復合鍵表,帶有一個額外的列。
數據庫架構
+-----------+---------+
| CODE | TYPE |
+-----------+---------+
| category | VARCHAR |
| code | VARCHAR |
+-----------+---------+
|
|
+----------------------+---------+
| RESPONSE_DOMAIN_CODE | TYPE |
+----------------------+---------+
| response_domain_id | KEY |
| code_id | KEY |
| rank | VARCHAR |
+----------------------+---------+
|
|
+--------------------+------+
| RESPONSE_DOMAIN | TYPE |
+--------------------+------+
| response_domain_id | PK |
| response_kind_id | FK |
+--------------------+------+
ResponseDomain.java
@Entity
@Table(name = "responseDomain")
public class ResponseDomain implements Serializable {
@Id
@Column(name = "responseDomain_id")
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@ManyToOne
@JoinColumn(name = "respons_kind_id")
private ResponseKind responseKind;
@OneToMany(fetch = FetchType.EAGER, mappedBy = "pk.responseDomain", cascade = CascadeType.ALL)
private Set<ResponseDomainCode> responseDomainCodes = new HashSet<>();
//Omitted rest.
}
Code.java
@Entity
@Table(name = "code")
public class Code implements Serializable {
@Id
@Column(name = "code_id")
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String category;
private String code;
@OneToMany(fetch = FetchType.EAGER, mappedBy = "pk.code", cascade = CascadeType.ALL)
private Set<ResponseDomainCode> responseDomainCodes = new HashSet<>();
//Omitted rest
}
ResponseDomainCode.java
@Entity
@Table(name = "responseDomain_code")
@AssociationOverrides(value = {
@AssociationOverride(name = "pk.responseDomain",
joinColumns = @JoinColumn(name = "responseDomain_id")),
@AssociationOverride(name = "pk.code",
joinColumns = @JoinColumn(name = "code_id"))
})
public class ResponseDomainCode implements Serializable {
@EmbeddedId
private ResponseDomainCodeId pk = new ResponseDomainCodeId();
@Column(name = "rank")
private String rank;
public ResponseDomainCodeId getPk() {
return pk;
}
public void setPk(ResponseDomainCodeId pk) {
this.pk = pk;
}
public String getRank() {
return rank;
}
public void setRank(String rank) {
this.rank = rank;
}
@Transient
public ResponseDomain getResponseDomain() {
return getPk().getResponseDomain();
}
public void setResponseDomain(ResponseDomain responseDomain) {
this.getPk().setResponseDomain(responseDomain);
}
@Transient
public Code getCode() {
return getPk().getCode();
}
public void setCode(Code code) {
this.getPk().setCode(code);
}
//Omitted rest
}
ResponseDomainCodeId.java
@Embeddable
public class ResponseDomainCodeId implements Serializable {
@ManyToOne
private ResponseDomain responseDomain;
@ManyToOne
private Code code;
public ResponseDomainCodeId() {
}
public ResponseDomain getResponseDomain() {
return responseDomain;
}
public void setResponseDomain(ResponseDomain responseDomain) {
this.responseDomain = responseDomain;
}
public Code getCode() {
return code;
}
public void setCode(Code code) {
this.code = code;
}
//Omitted rest
}
在@adamw的幫助下,我通過更改映射來解決了這個問題。
代替使用組合鍵,而是生成具有其自己的唯一ID的表。
+----------------------+------------+
| RESPONSE_DOMAIN_CODE | TYPE |
+----------------------+------------+
| id | PK(BIGINT) |
| response_domain_id | BIGINT |
| code_id | BIGINT |
| rank | VARCHAR |
+----------------------+------------+
現在,而不是使用@Embeddable和@EmbeddedId,我在兩邊都有一個@ManyToOne和@OneToMany批注,並基於ResponseDomain進行查詢。
這樣也可以使用Hibernate Envers進行全面版本審核控制。
我希望這對某人有所幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.