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;