休眠多对多教程

介绍:

在本教程中,我们将学习使用Hibernate @ManyToMany注释定义和使用多对多实体关联。

上下文构建:

为了继续学习本教程,我们假设我们有两个实体- 雇员资格:

多对多

众所周知,一名雇员可以拥有多个资格。 此外,可以有N名具有特定资格的员工。 显然,这意味着“ 雇员”和“ 资格”实体共享多对多关系

Maven依赖项:

在我们的POM中,首先确保我们具有必需的依赖项:

<dependencies>
    ...
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>5.4.0.Final</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.13</version>
    </dependency>
    ...
</dependencies>

我们始终可以在Maven Central中找到最新的可用版本 另外,本教程使用MySQL数据库。

数据库设置:

为了表示ManyToMany关联,我们至少需要三个数据库表。 因此,假设我们有下面的ERD图表示我们的数据库:

多对多

另外,让我们创建表:

CREATE TABLE employee (
    emp_id INT(15) NOT NULL AUTO_INCREMENT,
    first_name VARCHAR(20) DEFAULT NULL,
    last_name  VARCHAR(20) DEFAULT NULL,
    PRIMARY KEY (emp_id)
);
 
CREATE TABLE qualification (
    qualification_id INT(15) NOT NULL AUTO_INCREMENT,
    title VARCHAR(20) DEFAULT NULL,
    PRIMARY KEY (qualification_id)
);
 
CREATE TABLE employee_qualification (
    emp_id INT(15) NOT NULL,
    qualification_id INT(15) NOT NULL,
    PRIMARY KEY (emp_id, qualification_id),
    CONSTRAINT employee_qualification_empIdFk 
      FOREIGN KEY (emp_id) REFERENCES employee(emp_id),
    CONSTRAINT employee_qualification_qualIdFk 
     FOREIGN KEY (qualification_id) REFERENCES qualification (qualification_id)
);

创建实体:

现在我们已经准备好数据库设置,让我们首先创建模型类– Employee

@Entity
@Table(name = "Employee")
public class Employee { 
    // ...
  
    @ManyToMany(cascade = { CascadeType.ALL })
    @JoinTable(
        name = "Employee_Qualification", 
        joinColumns = { @JoinColumn(name = "emp_id") }, 
        inverseJoinColumns = { @JoinColumn(name = "qualification_id") }
    )
    Set<Qualification> qualifications = new HashSet<>();
    
    ...
}

多对多关联具有两个方面-拥有方和反向/引用方在关系的所有者端指定了到数据库的实际物理映射 。 在这里, Employee是拥有的实体,因此我们使用@JoinTable批注定义了实际的物理数据库映射。 @JoinTable批注定义了employee_qualification连接表

@JoinColumn批注指定将用于联接表的列。 我们还提到了qualification_id是反向联接列。 它仅表示它是指关系的相反方面,即我们的资格等级。

现在让我们定义我们的资格实体类:

@Entity
@Table(name = "Qualification")
public class Qualification {    
    // ...  
  
    @ManyToMany(mappedBy = "qualifications")
    private Set<Employee> employees = new HashSet<>();
     
    ...
}

由于Qualification类是关联的引用侧或相反侧,因此我们已使用mappingBy属性引用其所属侧( Employee )。

同样我们可以看到,我们在两个实体中都使用了@ManyToMany注释。

使用多对多关联:

在我们的main()方法中,我们可以测试上述映射:

//In our MainApp class
public static void main(String[] args) {
    Session session = null;    
    try {
        SessionFactory factory = new Configuration()
          .configure().buildSessionFactory();
        session = factory.openSession();
        Transaction tranx = session.beginTransaction();
 
        Employee james = new Employee(1001, "James", "Allen");
        Employee selena = new Employee(1002, "Selena", "Gomez");
        
        Set<Employee> employees = new HashSet<>();
        employees.add(james);
        employees.add(selena);
        
        Qualification masters = 
          new Qualification(8787, "Masters Degree");
        masters.setEmployees(employees);     
        
        session.save(masters);
        tranx.commit();
    } catch(Exception e) {
        e.printStackTrace();
    }
    finally {
        if(session != null)
            session.close();
    }
 
}

在执行上述代码后,我们的测试数据将被插入到employeequalificationemployee_qualification表中。

结论:

在此迷你教程中,我们研究了如何建立ManyToMany JPA关联。 我们已经在普通的XML配置上使用了JPA批注,因为它们使用起来更加方便并且越来越流行。

翻译自: https://www.javacodegeeks.com/2019/04/hibernate-many-many-tutorial.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值