[英]@ManyToOne where target PK is part of FK
我正在關注一篇文章來配置兩個實體之間的關系:
+-----------------------------+ +---------------------------------+
| redacted_identifier | | redacted_identifier_year |
+-----------------------------+ +---------------------------------+
| redacted_identifier_id (PK) | | redacted_identifier_id (PK, FK) |
| ... | | year (PK) |
+-----------------------------+ | ... |
+---------------------------------+
我已經省略了與問題無關的字段並編輯了原始名稱,請容忍潛在的不一致。 編輯后的名稱保持相同的長度,稍后會詳細介紹。
我創建了這些類:
@Entity
@Table(identifier = "REDACTED_IDENTIFIER")
@SequenceGenerator(identifier = "REDACTED_IDENTIFIER_ID_SEQ", sequenceIdentifier = "REDACTED_IDENTIFIER_ID_SEQ", allocationSize = 1)
public class RedactedIdentifier implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "REDACTED_IDENTIFIER_ID_SEQ")
@Column(identifier="REDACTED_IDENTIFIER_ID", nullable = false)
private Long redactedIdentifierId;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private List<RedactedIdentifierYear> redactedIdentifierYearList;
public RedactedIdentifier() {
}
public void setRedactedIdentifierId(Long redactedIdentifierId) {
this.redactedIdentifierId = redactedIdentifierId;
}
public Long getRedactedIdentifierId() {
return redactedIdentifierId;
}
public List<RedactedIdentifierYear> getRedactedIdentifierYearList() {
if(this.redactedIdentifierYearList == null){
this.redactedIdentifierYearList = new ArrayList<RedactedIdentifierYear>();
}
return this.redactedIdentifierYearList;
}
public void setRedactedIdentifierYearList(List<RedactedIdentifierYear> redactedIdentifierYearList) {
this.redactedIdentifierYearList = redactedIdentifierYearList;
}
public RedactedIdentifierYear addRedactedIdentifierYear(RedactedIdentifierYear redactedIdentifierYear) {
getRedactedIdentifierYearList().add(redactedIdentifierYear);
redactedIdentifierYear.setRedactedIdentifier(this);
return redactedIdentifierYear;
}
public RedactedIdentifierYear removeRedactedIdentifierYear(RedactedIdentifierYear redactedIdentifierYear) {
getRedactedIdentifierYearList().remove(redactedIdentifierYear);
redactedIdentifierYear.setRedactedIdentifier(null);
return redactedIdentifierYear;
}
}
@Entity
@Table(identifier = "REDACTED_IDENTIFIER_YEAR")
@IdClass(RedactedIdentifierYearPK.class)
public class RedactedIdentifierYear implements Serializable {
@Id
@Column(nullable = false)
private Integer year;
@Id
@ManyToOne
@JoinColumn(identifier = "REDACTED_IDENTIFIER_ID", referencedColumnIdentifier = "REDACTED_IDENTIFIER_ID")
private RedactedIdentifier redactedIdentifier;
public RedactedIdentifierYear() {
}
public RedactedIdentifierYear(Integer year) {
this.year = year;
}
public void setYear(Integer year) {
this.year = year;
}
public Integer getYear() {
return year;
}
public void setRedactedIdentifier(RedactedIdentifier redactedIdentifier) {
this.redactedIdentifier = redactedIdentifier;
}
public RedactedIdentifier getRedactedIdentifier() {
return redactedIdentifier;
}
}
public class RedactedIdentifierYearPK implements Serializable {
private Long redactedIdentifier;
private Integer year;
public RedactedIdentifierYearPK() {
}
public RedactedIdentifierYearPK(Long redactedIdentifier, Integer year) {
this.redactedIdentifier = redactedIdentifier;
this.year = year;
}
public boolean equals(Object other) {
if (other instanceof RedactedIdentifierYearPK) {
final RedactedIdentifierYearPK otherRedactedIdentifierYearPK = (RedactedIdentifierYearPK)other;
final boolean areEqual = otherRedactedIdentifierYearPK.redactedIdentifier.equals(redactedIdentifier)
&& otherRedactedIdentifierYearPK.year.equals(year);
return areEqual;
}
return false;
}
public int hashCode() {
return super.hashCode();
}
public void setRedactedIdentifier(Long redactedIdentifier) {
this.redactedIdentifier = redactedIdentifier;
}
public Long getRedactedIdentifier() {
return redactedIdentifier;
}
public void setYear(Integer year) {
this.year = year;
}
public Integer getYear() {
return year;
}
}
然后我按如下方式使用它們:
public float assignRedactedIdentifierYear(RedactedIdentifier redactedIdentifier, Integer year) {
RedactedIdentifierYear redactedIdentifierYear = new RedactedIdentifierYear(year);
redactedIdentifier.addRedactedIdentifierYear(redactedIdentifierYear);
}
但是當刷新發生時,它會嘗試寫入一個完全錯誤的表:
INSERT INTO REDACTED_IDENTIFIER_REDACTED_IDENTIFIER_YEAR (REDACTE_REDACTED_IDENTIFIER_ID, REDACTEDIDENTIFIERYEARLIST_RED, REDACTEDIDENTIFIERYEARLIST_YEA) VALUES (?, ?, ?)
[params=(long) 2082, (long) 2082, (int) 2020]
^^^^ ^^^^
Correct ID from sequence (twice)
一些名稱已明確截斷為 30 個字符以符合 RDBMS (Oracle)。
我的實體設計有什么問題/缺失?
我在父實體中缺少mappedBy
屬性。 我正在檢查的文章可能認為這是理所當然的:
@OneToMany(mappedBy = "redactedIdentifier", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private List<RedactedIdentifierYear> redactedIdentifierYearList;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.