zoukankan      html  css  js  c++  java
  • Hibernate 一对一关联关系

    双向一对一关联关系:

    域模型:

      例如,部门只有一个部门经理,一个经理也只能管理一个部门。即,Department 中有一个Manager的引用,Manager 中又有一个Department 的引用。

    关系数据模型:

      按照主键映射: 这种方式跟 多对一关联关系非常相似,比如department 表有一个外键 MANAGER_ID 指向manager 表的ID, 此时Department 和 Manager 对应的这两张表是多对一的关联关系,为了实现一对一的关联关系,只要给 外键 MANAGER_ID 加上一个唯一约束,则可以实现一对一关联关系。

        需要注意的问题:

        ①、保存:建议先保存没有外键列的那一端的对象。

        ②、查询:默认情况下使用懒加载异常。

        ③、没有外键的一端需要使用 one-to-one 元素,该元素使用property-ref 属性指定使用 被关联实体主键以外的字段作为关联字段。

        ④、在查询没有外键关联的一端对象的时候,使用左外连接一并查询出其关联的对象,并进行初始化。

          也就是说:把懒加载属性设为true 的时候,查询 Manager 会一并把Department 查询出来,但是查询Department 并不会把Manager对象查询出来。

      按照外键映射:

        拥有外键的一端生成主键的方式要注意,不是使用 native ,而是使用 foreign

        示例:

        实体类按照主键映射的一样,区别在于映射文件。这里将映射文件代码贴出来。

    Department类的映射文件

    <class name="com.zcd.hibernate.oneToOnePrimary.Department" table="DEPARTMENT">
            <id name="id" type="java.lang.Integer">
                <column name="ID" />
                <generator class="foreign" >   <!-- 生成主键的方式 -->
                    <param name="property">manager</param>  <!-- 还要指定根据。。。 -->
                </generator>
                
            </id>
            
            <property name="name" type="java.lang.String">
                <column name="NAME" />
            </property>
            
            <one-to-one name="manager" class="com.zcd.hibernate.oneToOnePrimary.Manager" constrained="true">
                
            </one-to-one>
        </class>

    Manager的映射文件

    <class name="com.zcd.hibernate.oneToOnePrimary.Manager" table="MANAGER">
            <id name="id" type="java.lang.Integer">
                <column name="ID" />
                <generator class="native" />
            </id>
            
            <property name="name" type="java.lang.String">
                <column name="NAME" />
            </property>
            
            <one-to-one name="department" class="com.zcd.hibernate.oneToOnePrimary.Department"></one-to-one>
            
        </class>

    不管先插入哪一个对象,都会先发送被拿主键来作为他人外键的那个对象的插入SQL语句,比如这里不管先插入Department 还是Manager,都会先发送插入Manager 的SQL语句。

    有一个疑问:下面的代码为什么会保存两次 Manager 对象呢?

    @Test
        public void testDepartmentAndManager()
        {
            Department department = new Department();
            department.setName("研发部");
            
            Manager manager = new Manager();
            manager.setName("BB");
            
            department.setManager(manager);
            manager.setDepartment(department);
            
            oneToOnePrimaryService.saveDepartment(department);
            oneToOnePrimaryService.saveManager(manager);
            
        }

    Hibernate 一对一关联关系,使用外键映射和使用主键映射的区别:

    目前发现的一点区别如下,以后发现了在进行添加。

      外键映射 主键映射
    生成主键方式

    使用native

    <generator class="native" />

    使用foreign还有

    <generator class="foreign" >
      <param name="property">company</param>
    </generator>
       使用many-to-one 加上unique属性,另一端不需要修改,按自动生成的使用  使用one-to-one,加上contrained="true"属性,另一端不需要修改,按自动生成的使用

  • 相关阅读:
    docker是PaaS,与openstack是IaaS的关系
    nuget安装.net standard
    GitHub sync the original repository by pull request
    Is there a way to include commas in CSV columns without breaking the formatting?
    How to determine why visual studio might be skipping projects when building a solution
    IHttpHandler vs IHttpModule
    .NET 3.0 SDK Projects not Loading
    Microsoft Edge version
    Microsoft Edge High CPU and Memory
    Google Analytics
  • 原文地址:https://www.cnblogs.com/GooPolaris/p/7919416.html
Copyright © 2011-2022 走看看