大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 hot資訊 Hibernate多對多注解教程

Hibernate多對多注解教程

更新時間:2022-05-06 09:40:27 來源:動力節點 瀏覽909次

1. 簡介

在這個快速教程中,我們將快速了解如何使用@ManyToMany注釋在 Hibernate 中指定這種類型的關系。

2. 一個典型的例子

讓我們從一個簡單的實體關系圖開始——它顯示了兩個實體員工和項目之間的多對多關聯:

在這種情況下,任何給定的員工都可以分配到多個項目,并且一個項目可能有多個員工為其工作,從而導致兩者之間的多對多關聯。

我們有一個以employee_id作為主鍵的員工表和一個以project_id作為主鍵的項目表。這里需要一個連接表employee_project來連接雙方。

3. 數據庫設置

假設我們已經創建了一個名為spring_hibernate_many_to_many 的數據庫。

我們還需要創建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;

設置好數據庫后,下一步將是準備 Maven 依賴項和 Hibernate 配置。

4. 模型類

需要使用 JPA 注釋創建模型類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類都是相互引用的,這意味著它們之間的關聯是雙向的。

為了映射多對多關聯,我們使用@ManyToMany、@JoinTable和@JoinColumn注釋。讓我們仔細看看它們。

@ManyToMany注解在兩個類中都用于創建實體之間的多對多關系。

這種關聯有兩個方面,即擁有方和反方。在我們的示例中,擁有方是Employee ,因此通過使用Employee類中的@JoinTable注釋在擁有方指定連接表。@JoinTable用于定義連接/鏈接表。在這種情況下,它是Employee_Project。

@JoinColumn注釋用于指定與主表的連接/鏈接列。這里,連接列是employee_id,project_id是反向連接列,因為Project位于關系的反面。

在Project類中,在@ManyToMany注解中使用了mappedBy屬性,表示employees集合被owner側的project集合映射。

5. 執行

為了查看多對多注解的作用,我們可以編寫以下 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);
	    }
	}	
	//...
}

我們可以看到在數據庫中創建的兩個實體之間的多對多關系:employee、project和employee_project表以及表示該關系的示例數據。

提交申請后,顧問老師會電話與您溝通安排學習

免費課程推薦 >>
技術文檔推薦 >>
主站蜘蛛池模板: 精品福利一区 | 欧美日韩精品 | 日韩在线观看一区二区三区 | 国内精品小视频在线 | 欧美.成人.综合在线 | 欧美一级毛片高清免费观看 | 久久99久久99精品 | 欧美成人免费在线视频 | 色综合网亚洲精品久久 | 91视频成人 | 黄色片在线观看网站 | 欧美韩国日本在线观看 | 亚洲欧美成人在线 | 免费精品99久久国产综合精品 | 999热这里全都是精品 | 在线看v | 99久久网站| 九九九国产在线 | 不卡视频在线观看 | 啪啪婷婷| 亚洲欧美精品日韩欧美 | 亚洲第一永久在线观看 | 伊人影院在线视频 | 十八女人毛片 | 色综合五月天 | 四虎影视久久久免费 | 亚洲国产成人久久综合野外 | 黄片毛片免费在线观看 | 国产99视频精品免费视频7 | 天天操天天操天天操香蕉 | 在线观看视频亚洲 | 九九99久久精品影视 | jiucao在线观看精品 | 亚洲激情视频在线播放 | 被黑人做的白浆直流在线播放 | 国产精品视频99 | 亚洲精品成人久久 | 欧美中文综合在线视频 | 天天干妹子 | 久久综合欧美成人 | 中文字幕亚洲综合久久2 |