当前位置: 首页 > 知识库问答 >
问题:

在Spring Boot Jpa中连接三个实体的问题

公良骁
2023-03-14

假设我的数据库中有一个表project。每个项目有许多用户,每个用户可能有许多项目。这将是一个经典的manytomany-相关性,因此,如果我想在我的Spring Boot JPA中描述它,我可以如下所示:

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

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

  @ManyToMany
  html" target="_blank">public Set<Project> projectSet;
}

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

  @ManyToMany
  private Set<User> users;
}

实现我的存储库:

@Repository
public interface ProjectRepo implements JpaRepository<Project, Integer> {
  public Set<User> getAllUsers();
}

现在让我们假设我想指定每个用户在这个项目中的角色。因此,我将有一个表role,它使用以下实体表示来指定不同的角色:

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

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

但这与我的用户和项目有什么联系呢?所以我想展示的是,一个用户可以在一个项目中有一个角色,但在许多项目中有许多角色。此外,一个角色可以分配给一个或多个项目中的多个用户,一个项目可以有多个用户,其中每个用户只有一个角色,但有多个角色。如果我简单地将@manytomany集 roleset 添加到我的users,我就不能说哪个用户将在哪个项目中扮演哪个角色。那么该如何描绘呢?我需要创建第三个类来连接它们吗?

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

到目前为止还可以,所以我将创建以下assignment-class。我需要能够从用户跟踪到项目角色,所以我需要三个字段。让我们使用(通常的)用例:表赋值通过将FKs中的一个组合PK连接到names表来连接用户项目角色。现在Spring Boot JPA中的组合PK通常(据我所知)在使用@embeddable-注释的新类中提供。从这个角度来看,我会做以下几点:

@Embeddable
public class AssignmentId implements Serializable {
  private User user;
  private Project project;
  private Role role;
}

并将我的赋值-class更改为:

@Entity
@Table(name="ASSIGNMENT")
public class Assignment {
  @EmbeddedId
  private AssignmentId assignmentId;
}

现在,当这样做时,我在尝试运行Spring-Boot时遇到了以下错误:

beanCreationException:创建类路径资源[org/springframework/boot/autoconfigure/orm/jpa/hibernatejpaconfiguration.class]中定义的名为“Entity ManagerFactory”的bean时出错:调用init方法失败;嵌套异常是javax.persistence.persistenceException:[persistenceUnit:default]无法构建Hibernate SessionFactory;嵌套异常是org.hibernate.mappingException:无法确定表:赋值中列:[org.hibernate.mapping.column(project)]的类型:com.demo.example.entity.project

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

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

共有1个答案

匡旭东
2023-03-14

@manytoone中,您将引用分配中的用户项目角色,但您可能需要也可能不需要使用@onetomany。有一篇关于实现@oneTomany的最佳实践的非常好的文章:https://vladmihalcea.com/the-best-way-to-map-a-oneTomany-association-with-jpa-and-hibernate感谢@vlad-mihalcea

 类似资料:
  • 我想用spring数据写一个查询,可以找到所有有自己的狗和车的人…可以有任何身体帮助吗

  • AnsprechPartner Lieferant ansprechpartner.java lieferant.java 在我的AnsprechPartner.java中,我是这样做的: 在我的Lieferanten.java中,我是这样做的:

  • 另一个实体是: 我想编写一个接口,例如

  • 我正在尝试使用spring-jpa将三个实体(表)连接到一个使用多对多关系的表中。 三个类别是: 1]用户 有没有人可以帮助我使用多对多关系来连接这三个表,并让我知道如何使用spring-jpa和REST来实现这一点?另外,如果您能解释一下如何使用rest/curl命令在这个“user_resource_privilege”表中插入数据,那就太好了?

  • 我正在努力使用jpa Crudepository接口连接两个实体模型。我不知道如何映射两个实体模型并在@query注释中编写查询。这些是我的实体类。我想执行这个查询“从taxi\u driver\u映射中选择dppd.payment\u plan\u id,dppd.attribute\u value,dppd.attribute\u id作为tdm加入driver\u payment\u pla