Java 将Spring Boot Jpa中的三个实体相互连接时出现问题

Java 将Spring Boot Jpa中的三个实体相互连接时出现问题,java,spring,spring-data-jpa,Java,Spring,Spring Data Jpa,假设我的数据库中有一个表project。每个项目都有许多用户,每个用户可能有许多项目。这将是一个经典的manytomy-关联,因此,如果我想在我的Spring Boot JPA中描述这一点,我可以做如下操作: 设置我的实体并将它们连接起来: @Entity public class User { @id @Column(name="ID") public int id; @ManyToMany public Set<Project> projectSet;

假设我的数据库中有一个表
project
。每个
项目
都有许多
用户
,每个
用户
可能有许多
项目
。这将是一个经典的
manytomy
-关联,因此,如果我想在我的Spring Boot JPA中描述这一点,我可以做如下操作:

设置我的实体并将它们连接起来:

@Entity
public class User {
  @id
  @Column(name="ID")  
  public int id;

  @ManyToMany
  public Set<Project> projectSet;
}

@Entity
@Table(name="PROJECT")
public class Project {
  @id
  @Column("ID")
  private int id;

  @ManyToMany
  private Set<User> users;
}
但这与我的用户和项目有什么联系呢?所以我想展示的是,一个用户可以在一个项目中有一个角色,但在许多项目中有许多角色。此外,一个角色可以分配给一个或多个项目中的多个用户,一个项目可以有多个用户,其中每个用户只有一个角色,但有多个角色。如果我只是将一个
@ManyToMany Set roleSet
添加到我的
用户
,我无法确定哪个用户将在哪个项目中扮演哪个角色。那么如何描述呢?我需要创建第三个类来连接它们吗

编辑1:

为了让我澄清,我将尝试在marknote的回答中提供建议的代码-

假设我有上面的类(
Project
User
Role
),我想描述每个用户在一个项目中都有某个角色,但在另一个项目中可能有另一个角色。此外,一个项目中不可能有多个角色(保持简单)

因此,我将创建一个新类
赋值
(与我在数据库结构中解决该用例非常相似),并将其与我的
用户
、我的
项目
和我的
角色
连接起来

@Entity
@Table(name="USER")
public class User {
  @id
  @Column(name="id")
  private int id;

  @Column(name="firstname")
  private String firstname;

  @Column(name="lastname")
  private String lastname;

  @OneToMany
  private List<Assignment> assignments;
  //getters and setters and stuff
}

@Entity
@Table(name="PROJECT")
public class Project {
  @id
  @Column(name="PNUM")
  private String pnum;

  @Column(name="PNAME")
  private String pname;

  @OneToMany
  private List<Assignment> assignments;
  //getters and setters and stuff
}

@Entity
@Table(name="ROLE")
public class Role {
  @id
  @Column(name="id")
  private int id;

  @Column(name="DESCRIPTION")
  private String description;

  @OneToMany
  private List<Assignment> assignments;
  //getters and setters and stuff
}
并将我的
作业
-class更改为:

@Entity
@Table(name="ASSIGNMENT")
public class Assignment {
  @EmbeddedId
  private AssignmentId assignmentId;
}
现在这样做时,我在尝试运行spring boot时遇到以下错误:

org.springframework.beans.factory.BeanCreationException:创建名为“entityManagerFactory”的bean时出错,该bean在类路径资源[org/springframework/boot/autoconfigure/orm/jpa/hibernatejPacConfiguration.class]中定义:调用init方法失败;嵌套异常为javax.persistence.PersistenceException:[PersistenceUnit:default]无法构建Hibernate SessionFactory;嵌套异常为org.hibernate.MappingException:无法确定以下列的类型:com.demo.example.entity.Project,位于表:assignment:[org.hibernate.mapping.Column(Project)]

有人能解释这个错误吗?我认为,
@EmbeddedId
可能有问题

编辑2

问题在于
@Embedded
类。将
实体连接到元素时出现问题:

private Role role;
private Project project;
private User user;

取决于您的业务需求。 假设用户在项目中的角色不同,您可以引入另一个类
作业
,然后它变成3
@OneToMany
:)


您将使用
@manytone
分配中引用
用户
项目
角色
,但您可能需要也可能不需要使用
@OneToMany
。有一篇关于实现最佳实践的非常好的文章
@OneToMany
:感谢@vlad mihalcea

谢谢你的回答!我试图了解(在我的编辑1中)我是如何理解你的答案的,你能看一下并告诉我(以及可能的谷歌用户)这是否是你的建议吗?:)我只想澄清一下:在这种情况下,您在
分配
中有三个键,在数据库中没有来自
用户
分配
的引用,对吗?然而,在代码中,你在
项目中有
@OneToMany
用户
角色
,因此尽管你在数据库中没有从
用户
分配
的引用,但你在
实体中有它,对吗?嗨@Rüdiger,是的,你将引用
用户
项目
Role
Assignment
中使用
@ManyToOne
,但您可能需要也可能不需要使用
@OneToMany
。有一篇关于实现
@OneToMany
的最佳实践的非常好的文章:感谢@vlad mihalceaI不会在
Assignment
中使用
@embeddedId
。按照其他实体使用正常的
@Id
。添加三个@OneToMany`关系,然后在数据库中的“分配”表中的“用户id”和“项目id”列上添加唯一性约束,以确保用户每个项目只能有一个角色。
@Embeddable
public class AssignmentId implements Serializable {
  private User user;
  private Project project;
  private Role role;
}
@Entity
@Table(name="ASSIGNMENT")
public class Assignment {
  @EmbeddedId
  private AssignmentId assignmentId;
}
private Role role;
private Project project;
private User user;