hibernate一对多详解
hibernate一对多以部门员工为例
User.hbm.xml(多方)
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.hibernate.a_onetomany"> <class name="User" table="t_user"> <id name="id" > <generator class="native"/> <!-- 主键生成策略 --> </id> <property name="name"/> <!-- 表明本方是多方,对面是User类中的department属性 ,关联类 Department--> <many-to-one name="department" class="Department"></many-to-one> </class> </hibernate-mapping>
1、因本方为多方,所以使用many-to-one
2、name中填写关联的属性名
3、class中填写关联的类名
4、一般可以只写class不写name,因为可以通过反射机制进行判断
-------------------------------------
Department.hbm.xml(一方)
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.hibernate.a_onetomany"> <class name="Department" table="t_department"> <id name="id" > <generator class="native"/> </id> <property name="depatmentName"/> <!-- set集合是Department中的元素 外键名称是department_id 关联类User --> <set name="users"> <key column="department_id"></key> <one-to-many class="User" /> </set> </class> </hibernate-mapping>
1、有set集合的元素,所以用set
2、name中写set集合中的实例
3、主键key默认使用本方(一方)id,外键名
4、奔放为一方所以用one-to-many,关联类User
------------------------------------
User类
public class User { int id; String name; Department department; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Department getDepartment() { return department; } public void setDepartment(Department department) { this.department = department; } @Override public String toString() { return "User [id=" + id + ", name=" + name + "]"; } }
Department类
public class Department { int id; String depatmentName; Set<User> users=new HashSet<User>(); public int getId() { return id; } public void setId(int id) { this.id = id; } public String getDepatmentName() { return depatmentName; } public void setDepatmentName(String depatmentName) { this.depatmentName = depatmentName; } public Set<User> getUsers() { return users; } public void setUsers(Set<User> users) { this.users = users; } @Override public String toString() { return "Department [id=" + id + ", depatmentName=" + depatmentName + "]"; } }
-------------------------------------
App
public class MyTest { static SessionFactory sessionFactory = null; static { sessionFactory = new Configuration().configure() .addClass(Department.class).addClass(User.class) .buildSessionFactory(); }//获取会话工厂 @Test public void testApp() { Session sess = sessionFactory.openSession();//开启会话 Transaction ts = null; ts = sess.beginTransaction();//开启事务 //数据初始化 User user1 = new User(); user1.setName("name1"); User user2 = new User(); user2.setName("name2"); Department department = new Department(); department.setDepatmentName("开发部"); // 关联两个表 department.getUsers().add(user1); department.getUsers().add(user2); user1.setDepartment(department); user2.setDepartment(department); // 保存 sess.save(department); sess.save(user1); sess.save(user2); ts.commit();//提交事务 // TODO: handle exception sess.close();//关闭会话 } /** * 获取信息显示 */ @Test public void testAppGet() { Session sess = sessionFactory.openSession(); Transaction ts = null; ts = sess.beginTransaction(); Department department = (Department) sess.get(Department.class, 1); ts.commit(); System.out.println(department.getDepatmentName() + "\n" + department.getUsers().size() + "\n" + department.getUsers().iterator().toString() ); System.out.println("=============================="); User user= (User) sess.get(User.class, 1); Department dep = user.getDepartment(); System.out.println(user.getName()+"\n" +dep.getDepatmentName()); sess.close(); } }
存入数据(套路):
1、开启事务后,初始化数据
2、关联对象
3、存数据

浙公网安备 33010602011771号