【问题标题】:Implementing Composite (Embedded-ID) Foreign Key Relations using Spring Data JPA使用 Spring Data JPA 实现复合(嵌入式 ID)外键关系
【发布时间】:2020-10-24 15:14:21
【问题描述】:

有趣的是,对于看似常见的情况,我找不到任何解决方案!所以我在这里要求向Spring Data 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 代码将变得相当简单.但是假设我们有某种限制,我们需要尽可能地坚持这种设计。

【问题讨论】:

    标签: java spring hibernate jpa spring-data


    【解决方案1】:

    您需要使用@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;
        ...
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-27
      • 2021-05-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多