hibernate教程_Hibernate多对多教程
hibernate教程
介紹:
在本教程中,我們將學(xué)習(xí)使用Hibernate @ManyToMany注釋定義和使用多對(duì)多實(shí)體關(guān)聯(lián)。
上下文構(gòu)建:
為了繼續(xù)學(xué)習(xí)本教程,我們假設(shè)我們有兩個(gè)實(shí)體– 雇員和資格:
眾所周知,一名員工可以擁有多個(gè)資格。 此外,可以有N名具有特定資格的員工。 顯然,這意味著“ 雇員”和“ 資格”實(shí)體共享多對(duì)多關(guān)系 。
Maven依賴項(xiàng):
在我們的POM中,首先確保我們具有必需的依賴項(xiàng):
<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數(shù)據(jù)庫。
數(shù)據(jù)庫設(shè)置:
為了表示ManyToMany關(guān)聯(lián),我們至少需要三個(gè)數(shù)據(jù)庫表。 因此,假設(shè)我們有下面的ERD圖表示我們的數(shù)據(jù)庫:
另外,讓我們創(chuàng)建表:
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) );創(chuàng)建實(shí)體:
現(xiàn)在我們已經(jīng)準(zhǔn)備好數(shù)據(jù)庫設(shè)置,讓我們首先創(chuàng)建模型類– 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<>();... }多對(duì)多關(guān)聯(lián)具有兩個(gè)方面-擁有方和反向/引用方 。 在關(guān)系的所有者端指定了到數(shù)據(jù)庫的實(shí)際物理映射 。 在這里, Employee是擁有的實(shí)體,因此我們使用@JoinTable批注定義了實(shí)際的物理數(shù)據(jù)庫映射。 @JoinTable批注定義了employee_qualification連接表 。
@JoinColumn批注指定將用于聯(lián)接表的列。 我們還提到了qualification_id是反向聯(lián)接列。 它僅表示它是指關(guān)系的相反方面,即我們的資格等級(jí)。
現(xiàn)在讓我們定義我們的資格實(shí)體類:
@Entity @Table(name = "Qualification") public class Qualification { // ... @ManyToMany(mappedBy = "qualifications")private Set<Employee> employees = new HashSet<>();... }由于Qualification類是關(guān)聯(lián)的引用側(cè)或相反側(cè),因此我們已使用mappingBy屬性引用其所屬側(cè)( Employee )。
就像我們看到的一樣,我們?cè)趦蓚€(gè)實(shí)體中都使用了@ManyToMany注釋。
使用多對(duì)多關(guān)聯(lián):
在我們的main()方法中,我們可以測(cè)試上述映射:
//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();}}執(zhí)行上述代碼后,我們的測(cè)試數(shù)據(jù)將被插入到employee , qualification和employee_qualification表中。
結(jié)論:
在此迷你教程中,我們研究了如何建立ManyToMany JPA關(guān)聯(lián)。 我們已經(jīng)在普通的XML配置上使用了JPA批注,因?yàn)樗鼈兪褂闷饋砀奖悴⑶以絹碓搅餍小?
翻譯自: https://www.javacodegeeks.com/2019/04/hibernate-many-many-tutorial.html
hibernate教程
總結(jié)
以上是生活随笔為你收集整理的hibernate教程_Hibernate多对多教程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中国姓氏有多少 中国有几个姓氏
- 下一篇: java 常规类的可见性_Java 12