美文网首页
Hibernate学习10(映射一对一关联(外键))

Hibernate学习10(映射一对一关联(外键))

作者: 又是那一片天 | 来源:发表于2017-08-09 13:20 被阅读0次

如部门经理对应一个部门

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

  • 1.外键可以存放在任意一边,在需要存放外键的一端增加many-to-one元素 并为其添加唯一约束unique="true"

  • 2.另一端需要使用one-to-one元素,并使用property-ref属性指定被关联实体主键以外字段作为关联字段

通过外键方式映射一对一关联

对象一(部门)
//部门
public class Department {
    private Integer depId;
    private String depName;
    private Manager mgr;

    public Manager getMgr() {
        return mgr;
    }

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

    public Integer getDepId() {
        return depId;
    }

    public void setDepId(Integer depId) {
        this.depId = depId;
    }

    public String getDepName() {
        return depName;
    }

    public void setDepName(String depName) {
        this.depName = depName;
    }

}
对象二(部门经理)
//经理
public class Manager {

    private Integer mId;
    private String mName;
    private Department dep;
    public Integer getmId() {
        return mId;
    }
    public void setmId(Integer mId) {
        this.mId = mId;
    }
    public String getmName() {
        return mName;
    }
    public void setmName(String mName) {
        this.mName = mName;
    }
    public Department getDep() {
        return dep;
    }
    public void setDep(Department dep) {
        this.dep = dep;
    }
    
}
对象一(部门)映射文件: 建立一对多关系 为外键添加唯一约束
  • 使用many-to-one 映射一对一关联更新 unique="true"唯一约束
<hibernate-mapping>
    <class name="chen.Department" table="DEPARTMENT">
        <id name="depId" type="java.lang.Integer">
            <column name="DEPID" />
            <generator class="native" />
        </id>
        <property name="depName" type="java.lang.String">
            <column name="DEPNAME" />
        </property>
        <!-- 使用many-to-one 映射一对一关联更新
        unique="true"唯一约束
         -->
        <many-to-one name="mgr" class="chen.Manager" column="MGR_ID" unique="true"> </many-to-one>
    </class>
</hibernate-mapping>
部门数据表
对象二(经理)映射文件: 建立一对一关联
  • 使用 one-to-one映射一对一关联关系
  • 默认关联对方OID
  • property-ref="mgr"指定使用关联实体主键以外的字段关联 (对象属性名)
<hibernate-mapping>
    <class name="chen.Manager" table="MANAGER">
        <id name="mId" type="java.lang.Integer" access="field">
            <column name="MID" />
            <generator class="native" />
        </id>
        <property name="mName" type="java.lang.String" access="field">
            <column name="MNAME" />
        </property>
        <!-- 使用 one-to-one映射一对一关联关系 -->
        <!-- property-ref="mgr"指定使用关联实体主键以外的字段关联 (对象属性名) -->
        <one-to-one name="dep" class="chen.Department"
            property-ref="mgr"></one-to-one>
    </class>
</hibernate-mapping>

经理数据表
保存
  • 建议先保存没有外键列 减少update语句
    /**
     * 一对一关联(外键) 保存
     */
    public static void testOneToOneWSave() {
        StandardServiceRegistry registry = new StandardServiceRegistryBuilder().configure().build();// 配置文件configure()
        SessionFactory sessionFactory = new MetadataSources(registry).buildMetadata().buildSessionFactory();
        Session session = sessionFactory.openSession();
        Transaction transaction = session.beginTransaction();

        Department department = new Department();
        department.setDepName("研发部");

        Manager manager = new Manager();
        manager.setmName("张三");

        // 设置关联
        department.setMgr(manager);
        manager.setDep(department);

        // 建议先保存没有外键列 减少update语句
        session.save(manager);
        session.save(department);

        transaction.commit();
        session.close();
        sessionFactory.close();
    }
查询
  • 1.默认对关联属性使用懒加载
  • 2.会出现懒加载异常
  • 3.查询manager 对象链接条件不对 property-ref="mgr"指定使用关联实体主键以外的字段关联
    /**
     * 一对一关联(外键) 查询
     */
    public static void testOneToOneWGetA() {
        StandardServiceRegistry registry = new StandardServiceRegistryBuilder().configure().build();// 配置文件configure()
        SessionFactory sessionFactory = new MetadataSources(registry).buildMetadata().buildSessionFactory();
        Session session = sessionFactory.openSession();
        Transaction transaction = session.beginTransaction();

        // 1.默认对关联属性使用懒加载
        // 2.会出现懒加载异常
        Department department = session.get(Department.class, 1);
        System.out.println(department.getDepName());

        // 3.查询manager 对象链接条件不对
        Manager manager = department.getMgr();
        System.out.println(manager.getmName());

        transaction.commit();
        session.close();
        sessionFactory.close();
    }
  • 在查询没有外键的实体对象,使用的左外链接查询,一并查询出其关联对象
    /**
     * 一对一关联(外键) 查询
     */
    public static void testOneToOneWGetB() {
        StandardServiceRegistry registry = new StandardServiceRegistryBuilder().configure().build();// 配置文件configure()
        SessionFactory sessionFactory = new MetadataSources(registry).buildMetadata().buildSessionFactory();
        Session session = sessionFactory.openSession();
        Transaction transaction = session.beginTransaction();

        Manager manager = session.get(Manager.class, 1);
        System.out.println(manager.getmName());
        // 在查询没有外键的实体对象,使用的左外链接查询,一并查询出其关联对象
        System.out.println(manager.getDep().getDepName());

        transaction.commit();
        session.close();
        sessionFactory.close();
    }

相关文章

  • 初识Hibernate之关联映射(二)

    基于外键的单向一对一关联映射 基于主键的单向一对一关联映射 单向多对多关联映射 一、基于外键的单向一对一关联映射具...

  • Hibernate One-To-One Mapping

    Hibernate 一对一映射关系(唯一外键映射) 用户基本信息与扩展信息的映射关系 我们先来看看这一对一映射可以...

  • hibernate笔记-关联关系

    hibernate 关联关系主要有一对一,一对多,多对多 一对一关联 一对一关联包括: 主键关联 唯一外键关联 主...

  • Hibernate学习10(映射一对一关联(外键))

    如部门经理对应一个部门 基于外键的一对一关联关系 1.外键可以存放在任意一边,在需要存放外键的一端增加many-t...

  • ORM 关联关系

    关于文档的注解:仅供学习所用!!! -- ORM的映射关联关系,需要字段之间建立外键(如果指明可以省略建立外键) ...

  • Hibernate注解(三)关系映射级别注解

    一、关系映射级别注解 1、一对一单向外键关联 2、一对一双向外键关联 3、一对一单向外键联合主键 4、多对一单向外...

  • Hibernate学习9(映射一对多关联关系)

    映射多对一的关联关系 是Hibernate通过数据外键查询组织的 一个用户可有多个房产 一端对象(用户) 声明集合...

  • Hibernate9-Hibernate一对一外键&一对

    一对一外键双向关联 注:一对一外键双向关联是一对多外键关联的特例,只是在多的一方加了一个唯一性约束。USERS1表...

  • Flask-关系映射

    关系映射 一对多 在"多"表中增加外键关联,引用自"一"表中主键 在"一"表实现关联属性以及反向引用 一对一 A表...

  • LitePal

    关于LitePal(github地址) 数据库相关(表关联):一对一:数据表根据外键进行关联(哪个表添加外键都可以...

网友评论

      本文标题:Hibernate学习10(映射一对一关联(外键))

      本文链接:https://www.haomeiwen.com/subject/gqpfrxtx.html