Hibernate08_映射关系---OneToMany单向

来源:互联网 发布:安倍经济学 知乎 编辑:程序博客网 时间:2024/06/11 15:14

组和用户的关系–oneToMany

1.1、用户User, 多的一方

package com.chb.model;public class User {    private int id;    private String username;    private String passwd;    public User() {}    public User(int id, String username, String passwd) {        super();        this.id = id;        this.username = username;        this.passwd = passwd;    }    public int getId() {        return id;    }    public void setId(int id) {        this.id = id;    }    public String getUsername() {        return username;    }    public void setUsername(String username) {        this.username = username;    }    public String getPasswd() {        return passwd;    }    public void setPasswd(String passwd) {        this.passwd = passwd;    }}

1.2、User.hbm.xml, 由于OneToMany,是在“一”的一方管理关系, 所以User.hbm.xml只需要关注自己的属性映射关系。

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-mapping        SYSTEM        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd" ><!-- 映射对应的package --><hibernate-mapping package="com.chb.model">    <!-- 实体类User与数据库中表user_info对应 -->    <class name="User" table="user_table">        <id name="id" column="user_id">            <!-- id主键, 设为自增 -->            <generator class="native"></generator>        </id>        <property name="username" column="user_username"></property>        <property name="passwd" column="user_passwd"></property>    </class></hibernate-mapping>

1.3、实体类Group , “一”的一方, oneToMany 在”一”的一方对象中, 设置多的一方作为属性。

package com.chb.model;import java.util.Set;public class Group {    private int id;    private String groupName;    //oneToMany 在"一"的一方对象中, 设置多的一方作为属性。    private Set<User> users;    public Group(){}    public Group(int id, String groupName, Set<User> users) {        super();        this.id = id;        this.groupName = groupName;        this.users = users;    }    public int getId() {        return id;    }    public void setId(int id) {        this.id = id;    }    public String getGroupName() {        return groupName;    }    public void setGroupName(String groupName) {        this.groupName = groupName;    }    public Set<User> getUsers() {        return users;    }    public void setUsers(Set<User> users) {        this.users = users;    }}

1.4、Group的映射文件,

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-mapping        SYSTEM        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd" ><!-- 映射对应的package --><hibernate-mapping package="com.chb.model">    <!-- 实体类Group与数据库中表group_info对应 -->    <class name="Group" table="group_table">        <!-- id 主键, 设为自增 -->        <id name="id" column="group_id">            <generator class="native"></generator>        </id>        <property name="groupName" column="group_name"></property>        <set name="users">            <!-- 外键名称 -->            <key column="group_id"></key>            <!-- 对多关系对应的class -->            <one-to-many class="com.chb.model.User"/>        </set>    </class></hibernate-mapping>

1.5、配置文件hibernate.cfg.xml

<!-- ~ Hibernate, Relational Persistence for Idiomatic Java ~ ~ License:     GNU Lesser General Public License (LGPL), version 2.1 or later. ~ See the     lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>. --><!DOCTYPE hibernate-configuration PUBLIC        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"><!--one To Many使用 “一对多” 关系映射,因此我们在 “一” 的一方来描述,还需要添加一个 Group 属性。--><hibernate-configuration>    <session-factory>        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>        <property name="connection.url">jdbc:mysql://localhost:3307/hibernate</property>        <property name="connection.username">root</property>        <property name="connection.password">root</property>        <property name="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>        <property name="show_sql">true</property>        <property name="format_sql">true</property>        <!-- 第一次加载 hibernate 时根据实体类自动建立表结构,以后自动更新表结构 -->        <property name="hibernate.hbm2ddl.auto">update</property>        <mapping resource="com/chb/model/User.hbm.xml" />        <mapping resource="com/chb/model/Group.hbm.xml" />    </session-factory></hibernate-configuration>

1.6、测试添加

package com.chb.testgroup;import java.util.HashSet;import java.util.List;import java.util.Set;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.cfg.Configuration;import org.hibernate.query.Query;import com.chb.model.Group;import com.chb.model.User;public class TestOneToMany {    private SessionFactory sessionFactory;    private Session session;    public void getConnect() {        Configuration config = new Configuration().configure();        // 根据 configuration 建立 sessionFactory        sessionFactory = config.buildSessionFactory();         // 开启 session(相当于开启 JDBC 的 connection)        session = sessionFactory.openSession();        //开启事务        session.beginTransaction();    }    public void testOneToMany() {        getConnect();        Group group = new Group();        group.setId(1);        group.setGroupName("LOL");        //one to many 先添加“多”的一方        User u1 = new User();        u1.setUsername("chb");        u1.setPasswd("123456");        User u2 = new User();        u2.setUsername("tom");        u2.setPasswd("Net123!#");        Set<User> users = new HashSet<User>();        users.add(u1);        users.add(u2);        group.setUsers(users);        for (User user : users) {            session.save(user);        }        //然后添加"一"的一方        session.save(group);        close();    }    public static void main(String[] args) {        TestOneToMany test = new TestOneToMany();        test.testOneToMany();    }    /**     * 关闭Sesson 相当于关闭JDBC的connection     */    public void  close() {        if (session != null) {            //提交事务            session.getTransaction().commit();            session.close();        }        if (sessionFactory != null) {            sessionFactory.close();        }    }}

结果:会提交5条sql, 相对于manyToOne , 效率低一些。

特别注意: oneToMany在添加和维护关系比较麻烦, 所以在开发中, 不建议使用oneToMany的单向

1.7 、测试查询。

这里写图片描述

1.8、测试查询group中user的条数

这里写图片描述

1.8.1、使用lazy=extra, 稍微智能一些,会根据查询取得值的类型不同来判断是调用count还是投影

这里写图片描述

1.8.2、再次查询,注意sql变化

这里写图片描述

阅读全文
0 0