基于主键映射的 一对一关系

来源:互联网 发布:心理学书籍推荐 知乎 编辑:程序博客网 时间:2024/05/14 08:06

一.

二.代码

1.Department类

package cn.edu.sdut.hibernate.onetoone2;public class Department {private  int deId;private String deName;private Manager mgr;public int getDeId() {return deId;}public void setDeId(int deId) {this.deId = deId;}public String getDeName() {return deName;}public void setDeName(String deName) {this.deName = deName;}public Manager getMgr() {return mgr;}public void setMgr(Manager mgr) {this.mgr = mgr;}}
2.Manager类

package cn.edu.sdut.hibernate.onetoone2;public class Manager {private int maId;private String mName;private Department department;public int getMaId() {return maId;}public void setMaId(int maId) {this.maId = maId;}public String getmName() {return mName;}public void setmName(String mName) {this.mName = mName;}public Department getDepartment() {return department;}public void setDepartment(Department department) {this.department = department;}}

3Department.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"><!-- Generated 2016-10-30 14:28:39 by Hibernate Tools 3.4.0.CR1 --><hibernate-mapping>    <class name="cn.edu.sdut.hibernate.onetoone2.Department" table="DEPARTMENTS">        <id name="deId" type="int">            <column name="DE_ID" />             <!-- 使用外键的方式来生成当前的主键 -->            <generator class="foreign" >            <!-- property 属性指定使用当前持久化类的哪一个属性的主键作为外键 -->            <param name="property">mgr</param>            </generator>        </id>        <property name="deName" type="java.lang.String">            <column name="DE_NAME" />        </property>               <!--  采用 foreign 主键生成器策略的一端增加 one-to-one 元素映射关联属性,其 one-to-one 节点还应增加 constrained=true 属性, 以使当前的主键上添加外键约束-->        <one-to-one name="mgr" class="cn.edu.sdut.hibernate.onetoone2.Manager" constrained="true"></one-to-one>    </class></hibernate-mapping>

4.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"><!-- Generated 2016-10-30 14:28:39 by Hibernate Tools 3.4.0.CR1 --><hibernate-mapping>    <class name="cn.edu.sdut.hibernate.onetoone2.Manager" table="MANAGERS">        <id name="maId" type="int">            <column name="MA_ID" />            <generator class="native" />        </id>        <property name="mName" type="java.lang.String">            <column name="M_NAME" />        </property>        <one-to-one name="department" class="cn.edu.sdut.hibernate.onetoone2.Department"         ></one-to-one>    </class></hibernate-mapping>

5.DoubleOneToOneTest类

package cn.edu.sdut.hibernate.onetoone2;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.Transaction;import org.hibernate.cfg.Configuration;import org.hibernate.service.ServiceRegistry;import org.hibernate.service.ServiceRegistryBuilder;import org.junit.After;import org.junit.Before;import org.junit.Test;public class DoubleOneToOneTest {private SessionFactory sessionFactory;private Session session;private Transaction transaction;@Beforepublic void init(){Configuration configuration = new Configuration().configure();ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();sessionFactory = configuration.buildSessionFactory(serviceRegistry);session = sessionFactory.openSession();transaction = session.beginTransaction();}@Afterpublic void destory(){transaction.commit();session.close();sessionFactory.close();}@Testpublic void testSave(){Manager manager = new Manager();manager.setmName("csc");Department department = new Department();department.setDeName("AA");department.setMgr(manager);manager.setDepartment(department);//保存的时候先保存1to1的,后保存nto1(设置为unique = true),效率高session.save(manager);session.save(department);}@Testpublic void testGet(){//get获取的时候不会出现懒加载异常,因为在得到manger的时候会把所有的信息加载出来Manager manager = (Manager) session.get(Manager.class, 3);System.out.println(manager.getDepartment().getClass().getName());Department department = (Department) session.get(Department.class, 2);System.out.println(department.getMgr().getClass().getName());}@Testpublic void testDelete(){//再不设置联级关系的时候不能联级删除Manager manager = (Manager) session.get(Manager.class, 2);//Department department = (Department) session.get(Department.class, 1);//session.delete(department);session.delete(manager);}}

6.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">csc</property>    <property name="connection.driver_class">com.mysql.jdbc.Driver</property>    <property name="connection.url">jdbc:mysql:///hibernate5</property>        <!-- 配置hibernate的基本信息 -->    <!-- hibernate 所使用的数据库方言 -->    <property name="dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>        <!-- 执行sql时是否在控制台上打印 -->    <property name="show_sql">true</property>        <!-- 是否对sql进行格式化 -->    <property name="format_sql">true</property>        <!-- 指定自动生成数据表的策略 -->    <property name="hbm2ddl.auto">update</property>        <!-- 指定session的delete方法会把对象的id置为null -->    <property name="hibernate.use_identifier_rollback">true</property>        <!-- 指定数据库的隔离级别 -->    <property name="connection.isolation">2</property>        <!-- 配置c3p0数据池 -->    <property name="hibernate.c3p0.max_size">100</property>    <property name="hibernate.c3p0.min_size">20</property>    <property name="hibernate.c3p0.acquire_increment">5</property>    <property name="hibernate.c3p0.timeout">2000</property>    <property name="hibernate.c3p0.idle_test_period">2000</property>    <property name="hibernate.c3p0.max_statements">10</property>        <!-- 设定JDBC的statment读取数据的时候每次在数据库中读取的记录的条数 -->    <property name="hibernate.jdbc.fetch_size">100</property>    <!-- 设定对数据进行批量操作,批次更新和批次插入的批次大小 -->    <property name="hibernate.jdbc.batch_size">30</property>        <!-- 指定关联的xxx.hbm.xml文件 -->    <mapping resource="cn/edu/sdut/hibernate/helloworld/News.hbm.xml"/>    <mapping resource="cn/edu/sdut/hibernate/manytoone/Customer.hbm.xml"/>    <mapping resource="cn/edu/sdut/hibernate/manytoone/Order.hbm.xml"/>    <!--      <mapping resource="cn/edu/sdut/hibernate/onetoone/Department.hbm.xml"/>    <mapping resource="cn/edu/sdut/hibernate/onetoone/Manager.hbm.xml"/>    -->    <mapping resource="cn/edu/sdut/hibernate/onetoone2/Department.hbm.xml"/>    <mapping resource="cn/edu/sdut/hibernate/onetoone2/Manager.hbm.xml"/>    </session-factory></hibernate-configuration>



0 0
原创粉丝点击