gpt4 book ai didi

java - 在 Spring Boot Jpa 中相互连接三个实体的问题

转载 作者:行者123 更新时间:2023-11-30 07:43:08 25 4
gpt4 key购买 nike

假设我有一个表 project在我的数据库中。每个project有很多users每个 user可能有很多 projects .这将是一个经典ManyToMany -相关性等等,如果我想在我的 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;
}

实现我的存储库:

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

现在假设我想指定每个用户在此项目中的角色。所以我会有一张 table role指定具有以下实体表示的不同角色:

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

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

但这与我的用户和项目有何关联?所以我想展示的是,一个用户可以在一个项目中拥有一个角色,但在多个项目中可以拥有多个角色。此外,一个角色可以分配给一个或多个项目中的多个用户,一个项目可以有多个用户,其中每个用户只有一个角色,但有很多角色。如果我简单地添加一个 @ManyToMany Set<Roles> roleSet到我的Users ,我不能说哪个用户在哪个项目中扮演哪个角色。那么如何描绘呢?我是否需要创建第三个类来连接它们?

编辑 1:

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

假设我有上面的类( ProjectUserRole )并且我想描述每个用户在一个项目中都有特定的角色,但可能在另一个项目中有另一个角色。此外,不可能在一个项目中扮演多个角色(为简单起见)。

所以我会创建一个新类 Assignment (很像我会在我的数据库结构中解决这个用例)并将它与我的 User 连接起来, 我的 Project和我的 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
}

到目前为止一切正常,所以我要创建以下 Assignment -类(class)。我需要能够从 User 追踪至 ProjectRole ,所以我需要这三个字段。让我们想象一下(通常的)用例:表 Assignment正在连接 User , ProjectRole通过将 FK 中的 PK 组合到名称表中。现在,通常(据我所知)在使用 @Embeddable 的新类中提供 Spring Boot JPA 中的组合 PK。 -注解。从这个角度来看,我会做以下事情:

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

并更改我的 Assignment -类:

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

现在这样做时,我在尝试运行 spring-boot 时遇到以下错误:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.MappingException: Could not determine type for: com.demo.example.entity.Project, at table: assignment, for columns: [org.hibernate.mapping.Column(project)]

有人可以解决这个错误吗? @EmbeddedId 可能有问题我想。

编辑2

问题出在 @Embedded类(class)。连接 Entity 时出现问题到一个元素:

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

最佳答案

取决于您的业务需求。假设用户在项目中的角色会有所不同,可以引入另一个类Assignment ,则变为 3 @OneToMany :) enter image description here

您将引用User , Project , RoleAssignment@ManyToOne , 但您可能需要也可能不需要使用 @OneToMany .关于工具的最佳实践有一篇很好的文章@OneToMany : https://vladmihalcea.com/the-best-way-to-map-a-onetomany-association-with-jpa-and-hibernate感谢@vlad-mihalcea

关于java - 在 Spring Boot Jpa 中相互连接三个实体的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53733602/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com