Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Spring数据JPA实现复合(嵌入式ID)外键关系_Java_Spring_Hibernate_Jpa_Spring Data - Fatal编程技术网

Java 使用Spring数据JPA实现复合(嵌入式ID)外键关系

Java 使用Spring数据JPA实现复合(嵌入式ID)外键关系,java,spring,hibernate,jpa,spring-data,Java,Spring,Hibernate,Jpa,Spring Data,有趣的是,对于一个看似常见的场景,我找不到任何解决方案!所以我在这里要求向有经验的专业人士学习。我会考虑使用,使样本代码更加简洁。 考虑一个简单的web应用程序示例。我定义了两个简单实体,如下所示: @数据 @实体 公映{ @身份证 @生成值 私人长id; 私有字符串标题; 私人国际年; 私人内部评级; } @资料 @实体 公共级演员{ @身份证 @生成值 私人长id; 私有字符串名; 私有字符串lastName; 私人约会生日; 私人字符串性别; } 现在我们需要一个连接表来链接这两个实体;

有趣的是,对于一个看似常见的场景,我找不到任何解决方案!所以我在这里要求向有经验的专业人士学习。我会考虑使用,使样本代码更加简洁。

考虑一个简单的web应用程序示例。我定义了两个简单实体,如下所示:

@数据
@实体
公映{
@身份证
@生成值
私人长id;
私有字符串标题;
私人国际年;
私人内部评级;
}
@资料
@实体
公共级演员{
@身份证
@生成值
私人长id;
私有字符串名;
私有字符串lastName;
私人约会生日;
私人字符串性别;
}
现在我们需要一个连接表来链接这两个实体;但这不仅仅是一个简单的联接表。除了
actor
movie
列之外,此表还有一些附加属性。我们不想通过在此处添加
ID
列来浪费存储空间,而是使用了由
actor
movie
组成的复合键:

@数据
@可嵌入
公共类MovieActorId实现可序列化{
私人演员;
私人电影;
}
@资料
@实体
公共级电影演员{
@嵌入ID
私人电影制片id;
私人薪酬;
私有字符串字符名;
}
这里有两个多对一关系:
MovieActor>--Actor
MovieActor>--Movie

现在我的主要问题是:“假设上述设计,我应该如何定义此设计中的
@manytone
关系?”

注意:我相信如果我们在
MovieActor
连接表中添加一个额外的
ID
列,而不是复合/嵌入的
movieactrid
,JPA代码将变得相当直接。但是假设我们有某种限制,我们需要尽可能地坚持这种设计。

您需要使用它为
@manytone
关系中的
嵌入ID
主键提供映射

@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;
    ...
}