亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何正確映射主鍵由兩個外鍵組成的實體,其中一個外鍵本身是復合的?

如何正確映射主鍵由兩個外鍵組成的實體,其中一個外鍵本身是復合的?

慕絲7291255 2023-10-19 21:50:01
我很難弄清楚如何在某個數據庫設計上正確執行 ORM。我的架構由三個表組成:用戶表、評論表和投票表。用戶可以發布對相冊的評論,還可以對任何評論進行正面或負面的評分。相冊是從外部 API 提供的,因此架構中缺少它們的表,但引用了它們的 ID。用戶主鍵僅由他們的用戶名組成。評論主鍵由評論者的用戶名(即外鍵)和評論的相冊 ID 組成。最后,投票主鍵由投票者的用戶名、外鍵和投票評論的主鍵組成,如前所述,投票主鍵由評論者的用戶名和評論的相冊 ID 組成。用戶可以為每個單獨的專輯發布評論,也可以為每個單獨的評論分配投票。這是表示架構的 ER 模型:為了映射實體 ID,我使用了注釋@IdClass,但我不確定我是否朝著正確的方向前進。我也嘗試過使用@EmbeddedId注釋,但結果是一樣的。這是我的實體類到目前為止的樣子:@Entitypublic class User implements Serializable {    private static final long serialVersionUID = 1;    @Id @Column(name = "username")    private String username;    @Column(unique = true, nullable = false)    private String email;    @Column(name = "password", nullable = false)    private String password;    @Temporal(TemporalType.TIMESTAMP) @Column(name="signUpDate", nullable = false)    private Date signUpDate;    // empty constructor, getters, setters, equals and hashCode implementations}@Entity @IdClass(ReviewId.class)public class Review implements Serializable {    private static final long serialVersionUID = 1;    @Id @ManyToOne @JoinColumn(name = "reviewerUsername", referencedColumnName = "username")    private User reviewer;    @Id @Column(name = "reviewedAlbumId")    private Long reviewedAlbumId;    @Column(name = "content", nullable = false, length = 2500)    private String content;    @Column(name = "rating", nullable = false)    private Integer rating;    @Temporal(TemporalType.TIMESTAMP) @Column(name = "publicationDate", nullable = false)    private Date publicationDate;    // empty constructor, getters, setters, equals and hashCode implementations}
查看完整描述

1 回答

?
慕森卡

TA貢獻1806條經驗 獲得超8個贊

這些關系是“派生身份”;因此您的 ID 類應如下所示(請注意外鍵字段的類型與其相應實體字段的類型不同):


public class ReviewId implements Serializable {


? ? private static final long serialVersionUID = 1L;


? ? private String reviewer; // matches name of @Id attribute and type of User PK

? ? private Long reviewedAlbumId;


? ? // ...


}

public static class VoteId implements Serializable {


? ? private static final long serialVersionUID = 1L;


? ? private String voter; // matches name of @Id attribute and type of User PK

? ? private ReviewId review; // matches name of @Id attribute and type of Review PK


? ? // ...


}

JPA 2.2 規范的第 2.4.1節討論了派生身份(并附有示例)。

另外,作為旁注,@IdClass它有點老派,但@EmbeddedId更干凈,消除了實體及其密鑰中重復的代碼。


查看完整回答
反對 回復 2023-10-19
  • 1 回答
  • 0 關注
  • 145 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號