1.新建工程项目hibernate_one2many_2,在该项目下添加hibernate所需的Jar包和数据库mysql驱动Jar包。
2.编写工具类HibernateUtils和ExportDB,代码如下:
HibernateUtils.java
- package com.i51pro.hibernate;
- import org.hibernate.Session;
- import org.hibernate.SessionFactory;
- import org.hibernate.cfg.Configuration;
- public class HibernateUtils {
- private static SessionFactory sessionFactory;
- static {
- try {
- Configuration cfg = new Configuration().configure();
- sessionFactory = cfg.buildSessionFactory();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- public static SessionFactory getSessionFactory() {
- return sessionFactory;
- }
- public static Session getSession() {
- return sessionFactory.openSession();
- }
- public static void closeSession(Session session) {
- if (session != null) {
- if (session.isOpen()) {
- session.close();
- }
- }
- }
- }
ExportDB.java
- package com.i51pro.hibernate;
- import org.hibernate.cfg.Configuration;
- import org.hibernate.tool.hbm2ddl.SchemaExport;
- public class ExportDB {
- /**
- * @param args
- */
- public static void main(String[] args) {
- Configuration cfg = new Configuration().configure();
- SchemaExport export = new SchemaExport(cfg);
- export.create(true, true);
- }
- }
3.编写实体类和映射文件,代码如下:
Student.java
- package com.i51pro.hibernate;
- public class Student {
- private int id;
- private String name;
- private Classes classes;
- 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 Classes getClasses() {
- return classes;
- }
- public void setClasses(Classes classes) {
- this.classes = classes;
- }
- }
Classes.java
- package com.i51pro.hibernate;
- import java.util.Set;
- public class Classes {
- private int id;
- private String name;
- private Set students;
- 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 Set getStudents() {
- return students;
- }
- public void setStudents(Set students) {
- this.students = students;
- }
- }
Student.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>
- <class name="com.i51pro.hibernate.Student" table="t_student">
- <id name="id">
- <generator class="native"/>
- </id>
- <property name="name" />
- <many-to-one name="classes" column="classesid" />
- </class>
- </hibernate-mapping>
Classes.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>
- <class name="com.i51pro.hibernate.Classes" table="t_classes">
- <id name="id">
- <generator class="native" />
- </id>
- <property name="name"/>
- <set name="students" inverse="true" cascade="all">
- <key column="classesid" />
- <one-to-many class="com.i51pro.hibernate.Student"/>
- </set>
- </class>
- </hibernate-mapping>
4.编写hibernate映射文件,代码如下:
- <!DOCTYPE hibernate-configuration PUBLIC
- "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
- "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
- <hibernate-configuration>
- <session-factory>
- <property name="hibernate.connection.url">jdbc:mysql://localhost/hibernate_one2many_2</property>
- <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
- <property name="hibernate.connection.username">root</property>
- <property name="hibernate.connection.password">admin</property>
- <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
- <property name="hibernate.show_sql">true</property>
- <mapping resource="com/i51pro/hibernate/Student.hbm.xml"/>
- <mapping resource="com/i51pro/hibernate/Classes.hbm.xml"/>
- </session-factory>
- </hibernate-configuration>
4.在工程项目hibernate_one2many_2下,建立SourceFolder,命名为test,在该包下编写测试类One2ManyTest,进行单元测试,代码如下:
- package com.i51pro.hibernate;
- import java.util.HashSet;
- import java.util.Iterator;
- import java.util.Set;
- import org.hibernate.Session;
- import org.hibernate.Transaction;
- import junit.framework.TestCase;
- public class One2ManyTest extends TestCase {
- public void testSave1() {
- Session session = null;
- try {
- session = HibernateUtils.getSession();
- Transaction tx = session.beginTransaction();
- Student student1 = new Student();
- student1.setName("学生1");
- session.save(student1);
- Student student2 = new Student();
- student2.setName("学生2");
- session.save(student2);
- Set students = new HashSet();
- students.add(student1);
- students.add(student2);
- Classes classes = new Classes();
- classes.setName("JAVA学习小组");
- classes.setStudents(students);
- //可以保存
- session.save(classes);
- session.getTransaction().commit();
- }catch(Exception e) {
- e.printStackTrace();
- session.getTransaction().rollback();
- }finally {
- HibernateUtils.closeSession(session);
- }
- }
- public void testSave2() {
- Session session = null;
- try {
- session = HibernateUtils.getSession();
- Transaction tx = session.beginTransaction();
- Classes classes = new Classes();
- classes.setName("JAVA研发小组");
- session.save(classes);
- Student student1 = new Student();
- student1.setName("程序员1");
- student1.setClasses(classes);
- session.save(student1);
- Student student2 = new Student();
- student2.setName("程序员2");
- student2.setClasses(classes);
- session.save(student2);
- session.getTransaction().commit();
- }catch(Exception e) {
- e.printStackTrace();
- session.getTransaction().rollback();
- }finally {
- HibernateUtils.closeSession(session);
- }
- }
- public void testSave3() {
- Session session = null;
- try {
- session = HibernateUtils.getSession();
- Transaction tx = session.beginTransaction();
- Classes classes = new Classes();
- classes.setName("JAVA研发开小组");
- Student student1 = new Student();
- student1.setName("程序员1");
- student1.setClasses(classes);
- Student student2 = new Student();
- student2.setName("程序员2");
- student2.setClasses(classes);
- Set students = new HashSet();
- students.add(student1);
- students.add(student2);
- classes.setStudents(students);
- //可以正确保存
- session.save(classes);
- session.getTransaction().commit();
- }catch(Exception e) {
- e.printStackTrace();
- session.getTransaction().rollback();
- }finally {
- HibernateUtils.closeSession(session);
- }
- }
- public void testLoad1() {
- Session session = null;
- try {
- session = HibernateUtils.getSession();
- session.beginTransaction();
- Classes classes = (Classes)session.load(Classes.class, 2);
- System.out.println("classes.name=" + classes.getName());
- Set students = classes.getStudents();
- for (Iterator iter=students.iterator(); iter.hasNext();) {
- Student student = (Student)iter.next();
- System.out.println("student.name=" + student.getName());
- }
- session.getTransaction().commit();
- }catch(Exception e) {
- e.printStackTrace();
- session.getTransaction().rollback();
- }finally {
- HibernateUtils.closeSession(session);
- }
- }
- public void testLoad2() {
- Session session = null;
- try {
- session = HibernateUtils.getSession();
- session.beginTransaction();
- Student student = (Student)session.load(Student.class, 1);
- System.out.println("student.name=" + student.getName());
- System.out.println("student.classes.name=" + student.getClasses().getName());
- session.getTransaction().commit();
- }catch(Exception e) {
- e.printStackTrace();
- session.getTransaction().rollback();
- }finally {
- HibernateUtils.closeSession(session);
- }
- }
- }
总结:hihernate一对多关联映射(双向Classes<----->Student)
一对多双向关联映射:
* 在一一端的集合上使用<key>,在对方表中加入一个外键指向一一端
* 在多一端采用<many-to-one>
注意:<key>标签指定的外键字段必须和<many-to-one>指定的外键字段一致,否则引用字段的错误
如果在”一“一端维护一对多关联关系,hibernate会发出多余的udpate语句,所以我们一般在多
的一端来维护关联关系
关于inverse属性:
inverse主要用在一对多和多对多双向关联上,inverse可以被设置到集合标签<set>上,
默认inverse为false,所以我们可以从”一“一端和”多“一端维护关联关系,
如果设置成inverse为true,则我们只能从多一端来维护关联关系
注意:inverse属性,只影响数据的存储,也就是持久化
inverse和cascade
* inverse是关联关系的控制方向
* cascade操作上的连锁反应