互联网登录的网站名,域名注册商查询,东莞自己建网站哪家强,网站建设评审意见一对多关系指出一个实体的单个实例与另一个实体的多个实例相关联。 换句话说#xff0c;一个表中的每个记录与另一个表中的多个记录相关联。 让我们看看如何通过XML映射文件在Hibernate中定义这种关系。 1.实体关系图 假设我们已经在数据库中创建了学生表和部门表#xff0… 一对多关系指出一个实体的单个实例与另一个实体的多个实例相关联。 换句话说一个表中的每个记录与另一个表中的多个记录相关联。 让我们看看如何通过XML映射文件在Hibernate中定义这种关系。 1.实体关系图 假设我们已经在数据库中创建了学生表和部门表下面是MySQL数据库中学生表和部门表的实体关系图 。 2. Maven依赖 首先在我们的maven项目中设置pom.xml文件。 确保我们将以下依赖项添加到我们的pom.xml文件中。 dependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion5.1.30/version
/dependency
dependencygroupIdorg.hibernate/groupIdartifactIdhibernate-core/artifactIdversion4.3.5.Final/version
/dependency3.休眠配置设置 确保已配置hibernate.cfg.xml文件并将其添加到类路径中的项目结构中。 ?xml version1.0 encodingutf-8?
!DOCTYPE hibernate-configuration PUBLIC-//Hibernate/Hibernate Configuration DTD 3.0//ENhttp://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd
hibernate-configurationsession-factory!-- Database connection settings --property nameconnection.driver_classcom.mysql.jdbc.Driver/propertyproperty nameconnection.urljdbc:mysql://localhost:3306/sample_db/propertyproperty nameconnection.usernameroot/propertyproperty nameconnection.passwordroot/propertyproperty namehibernate.dialectorg.hibernate.dialect.MySQLDialect/propertyproperty namehibernate.show_sqltrue/propertymapping resourceStudent.hbm.xml /mapping resourceDepartment.hbm.xml //session-factory
/hibernate-configuration4.实体类 在演示应用程序中我们有两个实体即学生和部门为此我们在数据库中有两个表。 因此我们需要创建与这些表相对应的实体类。 学生.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 SetStudent 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 SetStudent getStudents() {return students;}public void setStudents(SetStudent 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 version1.0 encodingUTF-8?
!DOCTYPE hibernate-mapping PUBLIC-//Hibernate/Hibernate Mapping DTD 3.0//ENhttp://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd
hibernate-mapping packagecom.jcombat.entityclass nameStudent tablestudentid namestudentId columnIDgenerator classnative //idproperty namefirstName columnFNAME /property namelastName columnLNAME /many-to-one namedepartment classcom.jcombat.entity.Department fetchselectcolumn nameDEPT_ID not-nulltrue //many-to-one/class
/hibernate-mapping Department.hbm.xml ?xml version1.0 encodingUTF-8?
!DOCTYPE hibernate-mapping PUBLIC-//Hibernate/Hibernate Mapping DTD 3.0//ENhttp://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd
hibernate-mapping packagecom.jcombat.entityclass nameDepartment tabledepartmentid namedepId columnDEPT_IDgenerator classnative //idproperty namedepName columnDEP_NAME /set namestudents tablestudent inversetrue cascadesave-update lazytrue fetchselectkeycolumn nameDEPT_ID not-nulltrue //keyone-to-many classcom.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);SetStudent studSet new HashSetStudent();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