基于主键的一对一关联关系

首先是两个Bean持久化类,Department部门类(引用外键)与Manager部门经理类.

Department部门类

//部门
public class Department {
    //部门ID
    private Integer deptId;
    //部门名
    private String depyName;

    //部门经理-外键
    private Manager mgr;


    public Department() {
        super();
    }


    public Department(Integer deptId, String depyName, Manager mgr) {
        super();
        this.deptId = deptId;
        this.depyName = depyName;
        this.mgr = mgr;
    }


    public Integer getDeptId() {
        return deptId;
    }


    public void setDeptId(Integer deptId) {
        this.deptId = deptId;
    }


    public String getDepyName() {
        return depyName;
    }


    public void setDepyName(String depyName) {
        this.depyName = depyName;
    }


    public Manager getMgr() {
        return mgr;
    }


    public void setMgr(Manager mgr) {
        this.mgr = mgr;
    }


}

Manager部门经理类

//部门经理类
public class Manager {
    //ID
    private Integer mgrId;
    //名字
    private String mgrName;

    //关联的部门
    private Department dept;

    public Manager() {
        super();
    }

    public Manager(Integer mgrId, String mgrName, Department dept) {
        super();
        this.mgrId = mgrId;
        this.mgrName = mgrName;
        this.dept = dept;
    }

    public Integer getMgrId() {
        return mgrId;
    }

    public void setMgrId(Integer mgrId) {
        this.mgrId = mgrId;
    }

    public String getMgrName() {
        return mgrName;
    }

    public void setMgrName(String mgrName) {
        this.mgrName = mgrName;
    }

    public Department getDept() {
        return dept;
    }

    public void setDept(Department dept) {
        this.dept = dept;
    }


}

然后是Bean持久化类的XML配置文件

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="entity4">

    <class name="Department" table="department">

        <id name="deptId" type="java.lang.Integer">
            <column name="deptId"/>
            <!-- 使用外键生成当前主键 -->
            <generator class="foreign">
                <!-- property:指定当前持久化类的哪一个属性作为外键 -->
                <param name="property">mgr</param>
            </generator>
        </id>

        <!-- property一般字段 -->
        <property name="depyName" type="java.lang.String">
            <column name="depyName"/>
        </property>

        <!-- 
            采用 foreign 主键生成策略的一端增加 one-to-one 元素映射关联属性
            其 one-to-one 节点还应增加constrained="true"属性,以使当前主键
            添加上外键约束
         -->
        <one-to-one name="mgr" class="Manager" constrained="true">
        </one-to-one>


    </class>
</hibernate-mapping>

Manager.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="entity4">

    <class name="Manager" table="manager">

        <!-- id:表中的主键,name:类中的属性名 -->
        <id name="mgrId" type="java.lang.Integer">
            <!-- name:表中的序列名 -->
            <column name="mgrId"/>
            <!-- 指定主键的生成方式,native:使用数据库本地的方式 -->
            <generator class="native"/>
        </id>

        <!-- property一般字段 -->
        <property name="mgrName" type="java.lang.String">
            <column name="mgrName"/>
        </property>

        <!-- 映射1-1关联关系 -->
        <one-to-one name="dept" class="Department">
        </one-to-one>

    </class>
</hibernate-mapping>

hibernate.cfg.xml

<?xml version='1.0' encoding='UTF-8'?> 
     <!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="connection.username">root</property>
        <property name="connection.password">1234</property>
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql://localhost:3306/hibernate</property>

        <!-- 配置Hibernate的基本信息 -->
        <!-- Hibernate所使用的数据库方言 -->
        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>

        <!-- 执行操作时是否在控制台打印SQL -->
        <property name="show_sql">true</property>

        <!-- 是否对SQL进行格式化 -->
        <property name="format_sql">true</property>

        <!-- 指定自动生成数据表的策略 -->
        <property name="hbm2ddl.auto">update</property>

        <!-- 指定   关联的关系/映射   文件,引入Bean的xml文件 -->
        <!-- 注:不是打.  用/ -->
        <!-- <mapping resource="entity1/Customer.hbm.xml"/>
        <mapping resource="entity1/Order.hbm.xml"/> -->

        <!-- <mapping resource="entity2/Customer.hbm.xml"/>
        <mapping resource="entity2/Order.hbm.xml"/> -->

        <!-- <mapping resource="entity3/Department.hbm.xml"/>
        <mapping resource="entity3/Manager.hbm.xml"/> -->

        <mapping resource="entity4/Department.hbm.xml"/>
        <mapping resource="entity4/Manager.hbm.xml"/>
    </session-factory>
</hibernate-configuration> 

HibernateTest测试类

public class HibernateTest {
    private SessionFactory sessionFactory;
    private Session session;
    private Transaction transaction;

    @Before
    public void init() {
        // 1.创建一个SessionFactory 对象
        sessionFactory = null;
            // 1.创建Configuration对象:对应Hibernate的基本配置信息和对象关系映射信息
            // configure();读取配置文件,无参默认读取hibernate.cfg.xml
            Configuration configuration = new Configuration().configure();

            /**
             * new Configuration 的几个方法
             * 
             * 读取的是hibernate.properties配置文件
             * 1:Configuration configuration = new Configuration();
             * 
             * 读取配置文件,无参默认读取hibernate.cfg.xml
             * 2:Configuration configuration = new Configuration().configure();
             * 
             * 读取配置文件,读取指定xml,传入一个File
             * 3:Configuration configuration = new Configuration().configure(file);
             */

            // 2.创建一个ServiceRegistry对象
            // Hibernate 的任何配置和服务都需要在该对象中注册后才有效
            ServiceRegistry serviceRegistry = new ServiceRegistryBuilder()
                .applySettings(configuration.getProperties())
                .buildServiceRegistry();
            // 3.创建一个SessionFactory
            sessionFactory = configuration.buildSessionFactory(serviceRegistry);
        // 2.创建一个Session对象
        session = sessionFactory.openSession();

        // 3.开启事物
        transaction = session.beginTransaction();
    }

    @After
    public void distroy() {
        // 5.提交事物
        transaction.commit();

        // 6.关闭Session对象
        session.close();

        // 7.关闭SessionFactory对象
        sessionFactory.close();
    }

    @Test
    public void test1(){
        Department dept = new Department();
        dept.setDepyName("dept-a");

        Manager mgr = new Manager();
        mgr.setMgrName("mgr-a");

        //设定关联关系
        dept.setMgr(mgr);
        mgr.setDept(dept);


        /**
         * 先插入Manager,后插入Department
         * 2条INSERT,0条UPDATE
         */
        session.save(mgr);
        session.save(dept);

        /**
         * 先插入Department,后插入Manager
         * 2条INSERT,0条UPDATE
         * 原因:不管代码里先save谁,执行时都
         * 先save Manager,再save Department
         */
        session.save(dept);
        session.save(mgr);
    }

    @Test
    public void test2(){
        /**
         * 1:默认情况下使用懒加载,department里不查询manager
         *   则manager没有被赋值
         * 2:会出现懒加载异常的问题
         */

        //Department获取
        Department dept = (Department) session.get(Department.class,1);
        //释放session
        session.close();
        //此时获取Department里的Manager
        Manager mgr = dept.getMgr();
        //正常输出
        System.out.println(mgr.getClass());
        //懒加载异常
        System.out.println(mgr.getMgrName());
    }

    @Test
    public void test3(){
        /**
         * 在查询没有外键的实体对象时,使用左外连接,
         * 一并查询出其关联的对象,并进行初始化
         */
        Manager mgr = (Manager) session.get(Manager.class,1);
        System.out.println(mgr.getMgrName());
        System.out.println(mgr.getDept().getDepyName());
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值