[英]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的答案中提供建議的代碼-
假設我有上面的類( Project
, User
, Role
),並且我想描述每個用戶在一個項目中都具有特定角色,但是在另一個項目中可能具有另一個角色。 同樣,在一個項目中不可能有多個角色(為了簡單起見)。
因此,我將創建一個新的類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
跟蹤到Project
以及到Role
,所以我需要三個字段。 讓我們想象一下(通常)用例:表Assignment
通過將FK中的組合PK組合到名稱表來連接User
, Project
和Role
。 現在,據我所知,通常在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
:)
你會參考User
, Project
, Role
的Assignment
與@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.