簡體   English   中英

在Spring Boot Jpa中相互連接三個實體時出現問題

[英]Problems wiring up three Entities in Spring Boot Jpa with each other

假設我的數據庫中有一個表project 每個project有許多users ,每個user可能有許多projects 這將是一個經典的ManyToMany -correlation關系,因此,如果我想在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();
}

現在假設我想指定每個用戶在該項目中所扮演的角色。 因此,我將擁有一個表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 ,則無法確定哪個User在哪個項目中將具有哪個Role。 那么如何描繪呢? 我需要創建第三類來連接它們嗎?

編輯1:

為了讓我澄清,我將嘗試在marknote的答案中提供建議的代碼-

假設我有上面的類( ProjectUserRole ),並且我想描述每個用戶在一個項目中都具有特定角色,但是在另一個項目中可能具有另一個角色。 同樣,在一個項目中不可能有多個角色(為了簡單起見)。

因此,我將創建一個新的類Assignment (非常類似於我將在數據庫結構中解決該用例的情況),並將其與UserProjectRole

@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跟蹤到Project以及到Role ,所以我需要三個字段。 讓我們想象一下(通常)用例:表Assignment通過將FK中的組合PK組合到名稱表來連接UserProjectRole 現在,據我所知,通常在Spring Boot JPA中使用@Embeddable -annotation的新類中提供了組合PK。 從這個角度來看,我將執行以下操作:

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

並將我的Assignment -class更改為:

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

現在,當這樣做時,在嘗試運行spring-boot時遇到以下錯誤:

org.springframework.beans.factory.BeanCreationException:創建在類路徑資源[org / springframework / boot / autoconfigure / orm / jpa / HibernateJpaConfiguration.class]中定義的名稱為'entityManagerFactory'的bean時出錯:調用init方法失敗; 嵌套的異常是javax.persistence.PersistenceException:[PersistenceUnit:默認]無法構建Hibernate SessionFactory。 嵌套的異常是org.hibernate.MappingException:無法確定com.demo.example.entity.Project的類型,在表:分配處,對於列:[org.hibernate.mapping.Column(project)]

有人可以跟這個錯誤有關嗎? 我認為@EmbeddedId可能有問題。

編輯2

問題在於@Embedded類。 Entity到元素時存在問題:

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

取決於您的業務需求。 假設用戶的角色在項目中會有所不同,您可以引入另一個類Assignment ,然后它變成3 @OneToMany :) 在此處輸入圖片說明

你會參考UserProjectRoleAssignment@ManyToOne ,但你可能會或可能不會需要使用@OneToMany 有一篇關於實現@OneToMany的最佳實踐的很好的文章: https ://vladmihalcea.com/the-best-way-to-map-a-onetomany-association-with-jpa-and-hibernate感謝@vlad -mihalcea

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM