[英]Implementing Composite (Embedded-ID) Foreign Key Relations using Spring Data JPA
有趣的是,對於一個看似常見的場景,我找不到任何解決方案! 所以在這里求教Spring資料JPA有經驗的專業人士。 我會考慮使用Lombok使示例代碼更加簡潔。
考慮一個簡單的IMDB示例 web 應用程序。 我定義了兩個簡單的實體如下:
@Data
@Entity
public class Movie {
@Id
@GeneratedValue
private long id;
private String title;
private int year;
private int rating;
}
@Data
@Entity
public class Actor {
@Id
@GeneratedValue
private long id;
private String firstName;
private String lastName;
private Date birthday;
private String gender;
}
現在我們需要一個連接表來鏈接這兩個實體; 但這不僅僅是一個簡單的連接表。 除了actor
和movie
列之外,該表還有一些其他屬性。 我們不想在這里添加ID
列來浪費存儲空間,而是使用由actor
和movie
組成的組合鍵:
@Data
@Embeddable
public class MovieActorId implements Serializable {
private Actor actor;
private Movie movie;
}
@Data
@Entity
public class MovieActor {
@EmbeddedId
private MovieActorId id;
private int salary;
private String characterName;
}
這里有兩個多對一關系: MovieActor >-- Actor
和MovieActor >-- Movie
。
現在我的主要問題是: “假設上面的設計,我應該如何定義這個設計中的@ManyToOne
關系?”
注意:我相信如果我們向MovieActor
連接表添加一個額外的ID
列而不是復合/嵌入的MovieActorId
,JPA 代碼將變得相當簡單。 但是假設我們有某種限制,我們需要盡可能地堅持這種設計。
您需要使用@MapsId為@ManyToOne
關系中的EmbeddedId
主鍵提供映射
@Data
@Embeddable
public class MovieActorId implements Serializable {
private long actorId;
private long movieId;
// constructor, setter, etc
}
@Data
@Entity
public class MovieActor {
@EmbeddedId
private MovieActorId id;
@ManyToOne(cascade = CascadeType.ALL)
@MapsId("actorId")
private Actor actor;
@ManyToOne(cascade = CascadeType.ALL)
@MapsId("movieId")
private Movie movie;
...
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.