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、存数据

 

posted @ 2017-08-27 12:26  sovagxa&静默  阅读(225)  评论(0)    收藏  举报