您好,登錄后才能下訂單哦!
這篇文章主要介紹了Hibernate多對多注解怎么實現(xiàn)的相關(guān)知識,內(nèi)容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇Hibernate多對多注解怎么實現(xiàn)文章都會有所收獲,下面我們一起來看看吧。
使用@ManyToMany注釋在 Hibernate 中指定這種類型的關(guān)系。
讓我們從一個簡單的實體關(guān)系圖開始——它顯示了兩個實體員工和項目之間的多對多關(guān)聯(lián):
在這種情況下,任何給定的員工都可以分配到多個項目,并且一個項目可能有多個員工為其工作,從而導(dǎo)致兩者之間的多對多關(guān)聯(lián)。
我們有一個以employee_id作為主鍵的員工表和一個以project_id作為主鍵的項目表。這里需要一個連接表employee_project來連接雙方。
假設(shè)我們已經(jīng)創(chuàng)建了一個名為spring_hibernate_many_to_many 的數(shù)據(jù)庫。
我們還需要創(chuàng)建employee和project表以及employee_project連接表,其中employee_id和project_id作為外鍵:
CREATE TABLE `employee` ( `employee_id` int(11) NOT NULL AUTO_INCREMENT, `first_name` varchar(50) DEFAULT NULL, `last_name` varchar(50) DEFAULT NULL, PRIMARY KEY (`employee_id`) ) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8;CREATE TABLE `project` ( `project_id` int(11) NOT NULL AUTO_INCREMENT, `title` varchar(50) DEFAULT NULL, PRIMARY KEY (`project_id`) ) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8;CREATE TABLE `employee_project` ( `employee_id` int(11) NOT NULL, `project_id` int(11) NOT NULL, PRIMARY KEY (`employee_id`,`project_id`), KEY `project_id` (`project_id`), CONSTRAINT `employee_project_ibfk_1` FOREIGN KEY (`employee_id`) REFERENCES `employee` (`employee_id`), CONSTRAINT `employee_project_ibfk_2` FOREIGN KEY (`project_id`) REFERENCES `project` (`project_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
設(shè)置好數(shù)據(jù)庫后,下一步將是準(zhǔn)備 Maven 依賴項和 Hibernate 配置。
需要使用 JPA 注釋創(chuàng)建模型類Employee和Project :
@Entity@Table(name = "Employee")public class Employee { // ... @ManyToMany(cascade = { CascadeType.ALL }) @JoinTable( name = "Employee_Project", joinColumns = { @JoinColumn(name = "employee_id") }, inverseJoinColumns = { @JoinColumn(name = "project_id") } ) Set<Project> projects = new HashSet<>(); // standard constructor/getters/setters}
@Entity@Table(name = "Project")public class Project { // ... @ManyToMany(mappedBy = "projects") private Set<Employee> employees = new HashSet<>(); // standard constructors/getters/setters }
正如我們所見,Employee類和Project類都是相互引用的,這意味著它們之間的關(guān)聯(lián)是雙向的。
為了映射多對多關(guān)聯(lián),我們使用@ManyToMany、@JoinTable和@JoinColumn注釋。讓我們仔細看看它們。
@ManyToMany注解在兩個類中都用于創(chuàng)建實體之間的多對多關(guān)系。
這種關(guān)聯(lián)有兩個方面,即擁有方和反方。在我們的示例中,擁有方是Employee ,因此通過使用Employee類中的@JoinTable注釋在擁有方指定連接表。@JoinTable用于定義連接/鏈接表。在這種情況下,它是Employee_Project。
@JoinColumn注釋用于指定與主表的連接/鏈接列。這里,連接列是employee_id,project_id是反向連接列,因為Project位于關(guān)系的反面。
在Project類中,在@ManyToMany注解中使用了mappedBy屬性,表示employees集合被owner側(cè)的project集合映射。
為了查看多對多注解的作用,我們可以編寫以下 JUnit 測試:
public class HibernateManyToManyAnnotationMainIntegrationTest { private static SessionFactory sessionFactory; private Session session; //... @Test public void givenSession_whenRead_thenReturnsMtoMdata() { prepareData(); @SuppressWarnings("unchecked") List<Employee> employeeList = session.createQuery("FROM Employee").list(); @SuppressWarnings("unchecked") List<Project> projectList = session.createQuery("FROM Project").list(); assertNotNull(employeeList); assertNotNull(projectList); assertEquals(2, employeeList.size()); assertEquals(2, projectList.size()); for(Employee employee : employeeList) { assertNotNull(employee.getProjects()); assertEquals(2, employee.getProjects().size()); } for(Project project : projectList) { assertNotNull(project.getEmployees()); assertEquals(2, project.getEmployees().size()); } } private void prepareData() { String[] employeeData = { "Peter Oven", "Allan Norman" }; String[] projectData = { "IT Project", "Networking Project" }; Set<Project> projects = new HashSet<Project>(); for (String proj : projectData) { projects.add(new Project(proj)); } for (String emp : employeeData) { Employee employee = new Employee(emp.split(" ")[0], emp.split(" ")[1]); employee.setProjects(projects); for (Project proj : projects) { proj.getEmployees().add(employee); } session.persist(employee); } } //...}
我們可以看到在數(shù)據(jù)庫中創(chuàng)建的兩個實體之間的多對多關(guān)系:employee、project和employee_project表以及表示該關(guān)系的示例數(shù)據(jù)。
關(guān)于“Hibernate多對多注解怎么實現(xiàn)”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對“Hibernate多對多注解怎么實現(xiàn)”知識都有一定的了解,大家如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。