簡體   English   中英

@ManyToOne,其中目標 PK 是 FK 的一部分

[英]@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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM