簡體   English   中英

使用 Spring 數據實現復合(嵌入式 ID)外鍵關系 JPA

[英]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;
}

現在我們需要一個連接表來鏈接這兩個實體; 但這不僅僅是一個簡單的連接表。 除了actormovie列之外,該表還有一些其他屬性。 我們不想在這里添加ID列來浪費存儲空間,而是使用由actormovie組成的組合鍵:

@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 >-- ActorMovieActor >-- 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.

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