Hibernate中各种关联关系配置

一、单向多对一

  举例:多个订单对应一个顾客

  顾客类Customer.java:

public class Customer{
    private Integer customerId;
    private String customerName;
//get() set() 省略
}

  订单类Order.java:

public class Order {
    private Integer orderId;
    private String orderName;

    private Customer customer;

    /**
    geter、seter   此处省略
   **/
}    

  Customer.hbm.xml:

<class name="Customer" table="Customer">
    <id name="customerId" column="COSTOMER_ID" type="integer">
    <generator class="native"/><!-- 主键生成策略native 不同数据库不同 -->
  </id>
  <property name="customerName" column="CUSTOMER_NAME" type="string"></property>
</class>

  Order.hbm.xml:

<class name="Order" table="order">
    <id name="orderId" column="ORDER_ID" type="integer">
            <generator class="native"/>
    </id>
  <property name="orderName" column="ORDER_NAME" type="string"></property>
  <!-- 映射多对一关系 -->
  <many-to-one name="customer" class="Customer" column="CUSTOMER_ID"></many-to-one>
</class>

二、双向多对一

  顾客类 Customer.java:

public class Customer{
    private Integer customerId;
    private String customerName;
//增加Set类型属性 并初始化空的Set
    private Set<Order> orders = new HashSet<Order>();

//get() set() 省略
}

  订单类Order.java

public class Order {
    private Integer orderId;
    private String orderName;

    private Customer customer;

    /**
    geter、seter   此处省略
   **/
}    

  Customer.hbm.xml

<class name="Customer" table="Customer">
    <id name="customerId" column="COSTOMER_ID" type="integer">
    <generator class="native"/>
  </id>
  <property name="customerName" column="CUSTOMER_NAME" type="string"></property>
  <set name="orders" table="order"  inverse="true"><!-- inverse设为true放弃维护关联关系 , 又另一端单独维护 -->
      <key column="CUSTOMER_ID"></key><!-- 指定外键字段 -->
    <one-to-many class="Order"/>
  </set>
</class>

  Order.hbm.xml

<class name="Order" table="order">
    <id name="orderId" column="ORDER_ID" type="integer">
            <generator class="native"/>
    </id>
  <property name="orderName" column="ORDER_NAME" type="string"></property>
  <!-- 映射多对一关系 -->
  <many-to-one name="customer" class="Customer" column="CUSTOMER_ID"></many-to-one>
</class>

三、单向一对一

  举例:一个部门Department 一个经理Manager

  实体类:Department.java

public class Department{
    private Integer departmentId;
    private String departmentName;
    private Manager manager;
//省略geter seter;
}

   Manager.java

public class Manager{
    private Integer managerId;
    private String managerName;
//省略geter,seter;
}

  1)基于外键的单向一对一:Department.hbm.xml

<class name="Department" table="DEPARTMENTS" >
        <id name="departmentId" column="DEPARTMENT_ID">
            <generator class="native" />
        </id>
        <property name="departmentName" column="DEPARTMENT_NAME" type="string">
        </property>
        <!-- 使用many-to-one 映射一对一, 一对一是一种特殊的多对一 -->
        <many-to-one name="manager" class="Manager" cascade="all" column="MANAGER_ID" unique="true"></many-to-one>
    </class>

  2)基于主键的单向1对1

<class name="Department" table="DEPARTMENTS" >
        <id name="departmentId" column="DEPARTMENT_ID">
            <generator class="foreign">
                <param name="property">manager</param>
            </generator>

        </id>
        <property name="departmentName" column="DEPARTMENT_NAME" type="string">
        </property>
        <one-to-one name="manager" class="Manager" cascade="all" constrained="true"></one-to-one>
    </class>
<!-- one-to-one的单向关联中,如果constrained=false,则会在查询时就全部取出来,用left outer join的方式。如果constrained=true,hibernate即会延迟加载sql,只把主表的查出来,等有用到关联表的再发sql取。 -->

四、双向一对一

  1)基于外键的双向一对一

  Department.java:

public class Department{
    private Integer departmentId;
    private String departmentName;
    private Manager Manager;
}

  Manager.java:

public class Manager{
    private Integer managerId;
    private String managerName;
    private Department department;
}

  Department.hbm.xml:

<class name="Department" table="departments">
  <id name="departmentId" column="DEPARTMENT_ID" type="integer">
            <generator class="native" />
  </id>
  <property name="departmentName" column="DEPARTMENT_NAME" type="string">
   </property>
  <many-to-one name="manager" column="MANAGER_ID" class="Manager" unique="true"/>
</class>

  Manager.hbm.xml:

    <class name="Manager" table="MANAGERS">
        <id name="managerId" column="MANAGER_ID" type="integer">
            <generator class="native" />
        </id>
        <property name="managerName" column="MANAGER_NAME" type="string">
        </property>
        <!--  没有外键的一端,使用one-to-one进行映射,并指定property-ref属性为关联实体外键所对应的属性-->
        <one-to-one name="department"  class="Department" property-ref="manager"></one-to-one>
    </class>

  2)基于主键的双向一对一:

  Department.hbm.xml:

<class name="Department" table="departments">
  <id name="departmentId" column="DEPARTMENT_ID" type="integer">
            <generator class="foreign">
        <param name="property">manager</param>
      </generator>
  </id>
  <property name="departmentName" column="DEPARTMENT_NAME" type="string">
   </property>
 <one-to-one name="manager" class="Manager" constrained="true"/>
</class>

  Manager.hbm.xml:

<class name="Manager" table="MANAGERS">
        <id name="managerId" column="MANAGER_ID" type="integer">
            <generator class="native" />
        </id>
        <property name="managerName" column="MANAGER_NAME" type="string">
        </property>
        <one-to-one name="department" class="Department" ></one-to-one>
 </class>

五、单向多对多

多对多需要一个中间表

Category.java

public class Category {
    private Integer id;
    private String name;

    private Set<Item> items = new HashSet<Item>();
}

Item.java

public class Item {
    private Integer id;
    private String name;
}

Category.hbm.xml

<class name="Category" table="CATEGORYS">
        <id name="id" column="CATEGORY_ID" type="integer">
            <generator class="native"></generator>
        </id>
        <property name="name" column="CATEGORY_NAME" type="string"></property>

        <set cascade="all" name="items" table="CATEGORYS_ITEMS"><!--中间表的名字-->
            <key column="CATEGORY_ID"></key>
            <many-to-many class="Item" column="ITEM_ID"></many-to-many>

        </set>
    </class>

Item.hbm.xml

<class name="Item" table="ITEMS" >
        <id name="id" column="ITEM_ID">
            <generator class="native" />
        </id>
        <property name="name" column="ITEM_NAME" type="string">
        </property>
    </class>

六、双向多对多

Category.java

public class Category {
    private Integer id;
    private String name;

    private Set<Item> items = new HashSet<Item>();
}

Item.java

public class Item {
    private Integer id;
    private String name;
    private Set<Category> categorys = new HashSet<Category>();
}

Category.hbm.xml

<class name="Category" table="CATEGORYS">
        <id name="id" column="CATEGORY_ID" type="integer">
            <generator class="native"></generator>
        </id>
        <property name="name" column="CATEGORY_NAME" type="string"></property>

        <set cascade="all" name="items" table="CATEGORYS_ITEMS"><!--中间表的名字-->
            <key column="CATEGORY_ID"></key>
            <many-to-many class="Item" column="ITEM_ID"></many-to-many>

        </set>
    </class>

Item.hbm.xml

<class name="Item" table="ITEMS" >
        <id name="id" column="ITEM_ID">
            <generator class="native" />
        </id>
        <property name="name" column="ITEM_NAME" type="string">
        </property>

        <set name="categorys" table="CATEGORYS_ITEMS" inverse="true"><!-- 必须有一端必须设置inverse -->
            <key column="ITEM_ID"></key>
            <many-to-many class="Category"  column="CATEGORY_ID"></many-to-many>
        </set>
    </class>

参考:尚硅谷Hibernate教程 http://www.atguigu.com/download.shtml

时间: 2024-10-10 00:39:39

Hibernate中各种关联关系配置的相关文章

Hibernate中连接数据库的配置

Hibernate连接数据库的配置 实体类的映射文件 连接数据库的配置文件: 完整的配置: Driver_class: Driver_class: 一定要把.class删掉. show_sql: 显示SQL语句: 必须要添加mapping标签,因为框架读配置文件的时候只会读一个,读配置文件,不会读映射文件,所以需要添加映射属性的文件. 原文地址:https://www.cnblogs.com/jianghaihang/p/10593439.html

hibernate中懒加载急加载的区别,get方法和load方的区别法

懒加载是hibernate中的关联关系对象的默认方式,懒加载也会先去查询对象然后获取对象的id, 当正真要对数据进行使用时才会正真写sql语句. 懒加载的有效加载期是在session打开的时候,所以在我们要使用到懒加载的时候必须要保持session的开启. 急加载就是直接用sql语句去访问数据库,但速度相对于懒加载更快. get()方法在执行时会立刻向数据库发出sql语句. load()方法和懒加载类似也是只有当真正使用该实体的属性时才会发出sql语句: 还有就是当数据库中查询不到东西时,方法会

《Java从入门到放弃》入门篇:hibernate中的多表对应关系

hibernate中的对应关系其实就是数据库中表的对应关系, 就跟某些电影中的某些场景是一样一样滴. 比如可以是一男一女,还可以是一男多女, 更可以是多男一女,最后最后最后还可以是多男多女!!! 有些不纯洁的看官肯定已经开始想歪了吧···,我还是上图吧!请看下图 我说滴是这样滴一群人打群架滴场景,嘿嘿嘿··· 好吧,进入正题!!! 数据库中表与表之间的数据映射关系有一对一,一对多,多对一,多对多.例如: 一个身份证只能对应一个护照,一个护照也只能对应一个身份证,这就是一对一的关系 一个男人可以有

Hibernate中一对多关联的时候hbm.xml文件的配置

body { font-family: 微软雅黑,"Microsoft YaHei", Georgia,Helvetica,Arial,sans-serif,宋体, PMingLiU,serif; font-size: 10.5pt; line-height: 1.5; } html, body { } h1 { font-size:1.5em; font-weight:bold; } h2 { font-size:1.4em; font-weight:bold; } h3 { fon

Hibernate 中配置属性详解(hibernate.properties)

Hibernate能在各种不同环境下工作而设计的, 因此存在着大量的配置参数.多数配置参数都 有比较直观的默认值, 并有随 Hibernate一同分发的配置样例hibernate.properties 来展示各种配置选项. 所需做的仅仅是将这个样例文件复制到类路径 (classpath)下并做一些自定义的修改. 属性1.Hibernate JDBC属性 属性名 用途 hibernate.connection.driver_class jdbc驱动类 hibernate.connection.ur

hibernate中1对1的注解配置

hibernate中1对1的注解配置分为:外键关联映射和主键关联映射 1.外键配置 //一方@Entity@Table(name="test_classinfo")public class ClassInfo { @Id @SequenceGenerator(name="seqClassInfo",sequenceName="seq_test_classinfo") @GeneratedValue(generator="seqClass

在Hibernate中如何配置二级缓存。

缓存就是把以前从数据库中查询出来和使用过的对象保存在内存中, 当以后要使用某个对象时,首先查询缓存中是否有这个对象, 如果有则使用缓存中的对象,如果没有则去查询数据库, 并将查询出来的对象保存在缓存中,以便下次使用, 而Hibernate中一级缓存session的作用不够明显, 通常用Hibernate的二级缓存,Hibernate的二级缓存是全局缓存. 借助第三方缓存: 比如ehcache.oscache..... 首先需要打开二级缓存,比如用ehcache: <!--         打开二

Hibernate中的映射关系(一对多)

在数据库中表和表之间的关系有几种,下面就详细说一下在Hibernate中怎样映射一对多的关系 Hibernate映射一对多的关系,其实就是持久类之间的映射,那如何把持久类关联起来呢??那就用到.hbm.xml文件的<many-to-one>标签了 具体做法如下: 新建一个customer类: package com.jeremy.hibernate.app.example; public class Customer { private Integer customerId; private

Hibernate中,基于Annotation的简单树形结构的实现

在系统设计中,经常用到递归性质的树形结果,比如菜单.多级分类等,一般是在同一个表中定义父子关系实现这种结构. 下面是在Hibernate中,基于Annotation的简单树形结构的实现: 第一步:创建Entity类,并添加注解实现关联关系    ps: 主要是利用@ManyToOne 和 @OneToMany 配置在同一个Entity类中实现树形递归的结构.hibernate注解形式比在xml配置更加简洁 TreeNode.java 1 package com.hfut.hibernate; 2