Hibernate中的一对多XML映射
一對多關系指出一個實體的單個實例與另一個實體的多個實例相關聯。 換句話說,一個表中的每個記錄與另一個表中的多個記錄相關聯。
讓我們看看如何通過XML映射文件在Hibernate中定義這種關系。
1.實體關系圖
假設我們已經在數據庫中創建了學生表和部門表,下面是MySQL數據庫中學生表和部門表的實體關系圖 。
2. Maven依賴
首先,在我們的maven項目中設置pom.xml文件。
確保我們將以下依賴項添加到我們的pom.xml文件中。
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.30</version> </dependency> <dependency><groupId>org.hibernate</groupId><artifactId>hibernate-core</artifactId><version>4.3.5.Final</version> </dependency>3.休眠配置設置
確保已配置hibernate.cfg.xml文件,并將其添加到類路徑中的項目結構中。
<?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernate-configuration PUBLIC"-//Hibernate/Hibernate Configuration DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration><session-factory><!-- Database connection settings --><property name="connection.driver_class">com.mysql.jdbc.Driver</property><property name="connection.url">jdbc:mysql://localhost:3306/sample_db</property><property name="connection.username">root</property><property name="connection.password">root</property><property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property><property name="hibernate.show_sql">true</property><mapping resource="Student.hbm.xml" /><mapping resource="Department.hbm.xml" /></session-factory> </hibernate-configuration>4.實體類
在演示應用程序中,我們有兩個實體,即學生和部門,為此,我們在數據庫中有兩個表。 因此,我們需要創建與這些表相對應的實體類。
學生.java
package com.jcombat.entity;public class Student {private String studentId;private String firstName;private String lastName;private Department department;public String getStudentId() {return studentId;}public void setStudentId(String studentId) {this.studentId = studentId;}public String getFirstName() {return firstName;}public void setFirstName(String firstName) {this.firstName = firstName;}public String getLastName() {return lastName;}public void setLastName(String lastName) {this.lastName = lastName;}public Department getDepartment() {return department;}public void setDepartment(Department department) {this.department = department;}}部門.java
package com.jcombat.entity;import java.util.Set;public class Department {private String depId;private String depName;private Set<Student> students;public String getDepId() {return depId;}public void setDepId(String depId) {this.depId = depId;}public String getDepName() {return depName;}public void setDepName(String depName) {this.depName = depName;}public Set<Student> getStudents() {return students;}public void setStudents(Set<Student> students) {this.students = students;} }5. Hibernate Utility類
為初始的Hibernate配置創建HibernateUtil.java ,它為我們提供了SessionFactory的重要性。
HibernateUtil.java
package com.jcombat.utility;import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration;public class HibernateUtil {private static final SessionFactory sessionFactory = buildSessionFactory();@SuppressWarnings("deprecation")private static SessionFactory buildSessionFactory() {try {return new Configuration().configure().buildSessionFactory();} catch (Throwable ex) {System.err.println("Initial SessionFactory creation failed." + ex);throw new ExceptionInInitializerError(ex);}}public static SessionFactory getSessionFactory() {return sessionFactory;} }6.休眠映射XML
為每個實體創建休眠映射文件。
Student.hbm.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC"-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.jcombat.entity"><class name="Student" table="student"><id name="studentId" column="ID"><generator class="native" /></id><property name="firstName" column="FNAME" /><property name="lastName" column="LNAME" /><many-to-one name="department" class="com.jcombat.entity.Department" fetch="select"><column name="DEPT_ID" not-null="true" /></many-to-one></class> </hibernate-mapping>Department.hbm.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC"-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.jcombat.entity"><class name="Department" table="department"><id name="depId" column="DEPT_ID"><generator class="native" /></id><property name="depName" column="DEP_NAME" /><set name="students" table="student" inverse="true" cascade="save-update" lazy="true" fetch="select"><key><column name="DEPT_ID" not-null="true" /></key><one-to-many class="com.jcombat.entity.Student" /></set></class> </hibernate-mapping>請注意,我們使用Set來映射與部門關聯的學生。
集合映射中經常使用“ Cascade”關鍵字來自動管理集合的狀態。 因此,如果有一組與特定部門相關聯的Student,并且我們保留了Department對象的狀態,則所有關聯的子Student對象也會自動保留,從而節省了手動保留它們的人工。 我們當前的示例也會發生同樣的情況。
7.最終項目結構
完成上述所有步驟后,請參考以下項目結構。
7.執行
我們快完成了。 剩下的唯一部分是從我們將執行應用程序的位置創建客戶端類。 因此,讓我們創建一個MainApp客戶端類。
MainApp.java
package com.jcombat.hibernate;import java.util.HashSet; import java.util.Set;import org.hibernate.Session; import org.hibernate.SessionFactory;import com.jcombat.entity.Department; import com.jcombat.entity.Student; import com.jcombat.utility.HibernateUtil;public class MainApp {public static void main(String[] args) {SessionFactory sf = HibernateUtil.getSessionFactory();Session session = sf.openSession();session.beginTransaction();Department department = new Department();department.setDepName("Electronics");Student student1 = new Student();student1.setFirstName("Abhimanyu");student1.setLastName("Prasad");student1.setDepartment(department);Student student2 = new Student();student2.setFirstName("Abhishek");student2.setLastName("Kumar");student2.setDepartment(department);Set<Student> studSet = new HashSet<Student>();studSet.add(student1);studSet.add(student2);department.setStudents(studSet);session.save(department);session.getTransaction().commit();session.close();} }右鍵單擊該類,然后將其作為“ Java應用程序”運行。 我們看到以下條目已登錄到IDE控制臺。
Hibernate: insert into department (DEP_NAME) values (?) Hibernate: insert into student (FNAME, LNAME, DEPT_ID) values (?, ?, ?) Hibernate: insert into student (FNAME, LNAME, DEPT_ID) values (?, ?, ?)驗證數據庫中的各個表是否有添加的條目。
- 下載源代碼
翻譯自: https://www.javacodegeeks.com/2015/12/one-many-xml-mapping-hibernate.html
總結
以上是生活随笔為你收集整理的Hibernate中的一对多XML映射的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: dota加入电脑口令(dota2口令)
- 下一篇: 学环境艺术设计的电脑需要什么配置?