hibernate之初学一对多和多对一配置及使用
按查询及存取速率来说的一对多用的相对多对一少一些,这里只写主要配置文件的代码
首先是hibernate的配置文件
<!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> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql:///webproject</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">123456</property> <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property> <property name="hibernate.show_sql">true</property> <property name="hibernate.hbm2ddl.auto">create</property> <mapping resource="com/shaoxin/entity/Dept.hbm.xml"/> <mapping resource="com/shaoxin/entity/Employee.hbm.xml"/> </session-factory> </hibernate-configuration>
一对多的配置文件代码,很明显使用到了set集合
<?xml version="1.0"?> <!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.shaoxin.entity"> <class name="Dept" table="dept"> <id name="deptid" column="deptid"> <generator class="native"></generator> </id> <property name="deptName" column="deptname"></property><!-- 一对多设置外键方式,class代表外键类型 --><set name="setEmployees" table="employee"> <key column="dept_id"></key> <one-to-many class="Employee"/> </set> </class> </hibernate-mapping>
对应的实体类:
package com.shaoxin.entity; import java.util.HashSet; import java.util.Set; public class Dept { private int deptid; private String deptName; private Set<Employee> setEmployees = new HashSet<Employee>(); public int getDeptid() { return deptid; } public void setDeptid(int deptid) { this.deptid = deptid; } public String getDeptName() { return deptName; } public void setDeptName(String deptName) { this.deptName = deptName; } public Set<Employee> getSetEmployees() { return setEmployees; } public void setSetEmployees(Set<Employee> setEmployees) { this.setEmployees = setEmployees; } }
多对一的配置文件代码,很明显是一个对象类型
<?xml version="1.0"?> <!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.shaoxin.entity"> <class name="Employee" table="employee"> <id name="employeeid" column="employeeid"> <generator class="native"></generator> </id> <property name="employeeName" column="employeename"/><!-- 多对一创建外键方式:属性分别为:外键对应的表,外键字段,外键类型 --><many-to-one name="dept" column="dept_id" class="Dept"></many-to-one> </class> </hibernate-mapping>
对应的实体类
package com.shaoxin.entity; public class Employee { private int employeeid; private String employeeName; private Dept dept; public int getEmployeeid() { return employeeid; } public void setEmployeeid(int employeeid) { this.employeeid = employeeid; } public String getEmployeeName() { return employeeName; } public void setEmployeeName(String employeeName) { this.employeeName = employeeName; } public Dept getDept() { return dept; } public void setDept(Dept dept) { this.dept = dept; } }
测试这两个存储方式
package com.shaoxin.entity; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; import org.hibernate.classic.Session; import org.junit.Test; public class TestMany2Many { static SessionFactory sf; static { sf = new Configuration().configure().buildSessionFactory(); } @Test public void testOne2Many() throws Exception { Session openSession = sf.openSession(); Transaction beginTransaction = openSession.beginTransaction(); Employee empzs = new Employee(); Employee empls = new Employee(); empls.setEmployeeName("李四"); empzs.setEmployeeName("张三"); Dept dept = new Dept(); dept.getSetEmployees().add(empls); dept.getSetEmployees().add(empzs); dept.setDeptName("应用开发"); openSession.save(empls); openSession.save(empzs); openSession.save(dept); beginTransaction.commit(); openSession.close(); } @Test public void testMany2One() throws Exception { Session openSession = sf.openSession(); Transaction beginTransaction = openSession.beginTransaction(); Employee empzs = new Employee(); Employee empls = new Employee(); Dept dept = new Dept(); dept.setDeptName("应用开发"); empls.setEmployeeName("李四"); empzs.setEmployeeName("张三"); empls.setDept(dept); empzs.setDept(dept); openSession.save(dept); openSession.save(empls); openSession.save(empzs); beginTransaction.commit(); openSession.close(); } }