Hibernate--hibernate.hbm.xml详解

  hibernate.hbm.xml是hibernate框架的映射关系的文件,使用.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 2015-10-28 11:14:01 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping package="org.entity.joined_subclass">
  <!--class 映射哪个类到哪个表--> <class name="Person" table="PERSONS" > <id name="id" type="java.lang.Integer"> <column name="PERSON_ID" /> <generator class="native" /> </id> <property name="name" type="java.lang.String"> <column name="PERSON_NAME" /> </property> <property name="age" type="java.lang.Integer"> <column name="PERSON_AGE" /> </property> <union-subclass name="Student" table="STUDENTS"> <property name="school" column="SCHOOL" type="string"></property> </union-subclass> </class> </hibernate-mapping>

  1.class节点

  <class name="Person" table="PERSONS" >
  name对应的是哪个类,table对应是数据库的表,dynamic-update:默认为false 设置为true时表示进行更新操作时只更新那些修改了的属性
 2.id节点 表的主键
  <generator class="native" />主键生成策略
      class="native":由hibernate自己判断采用identity,sequence,hilo方式去生成主键,最常用适合全部数据库

      class="assigned": java程序必须提供值
      class="sequence":使用oracle数据库,利用数据库的自增特性
      class="increment":有hibernate生成主键,每次去表里查最后一个主键的值,然后+1
      class="identity":利用数据库的自增特性 使用sql server,mysql
      class="hilo":由hibernate去帮你生成主键,采用高低算法 (适合全部数据库) 
  3.property节点:
    name:属性名   column:表里的字段名    index:锁引名  
    unique:是否唯一  update:是否可更新  type:类型  length:字段长度
  4.时期,时间的属性和字段映射
    类里的属性使用java.util.date类型映射时:
                        要日期:指定type为date
                        要时间:指定type为time
                        要日期和和时间:指定type为timestamp
  5.组建映射
    一个类,是另一个类的属性,但两个类,是一张表
<component name="address" class="Address">
    <property name="province" column="Province" type="string"></property>
    <property name="city" column="City" type="string"></property>
    <property name="area" column="Area" type="string"></property>
</component>

  6.一对多映射  

    最常见,两个表,对应两个类,表与表之间一对多关系。

     例如:一个user可以有多个order

//用户类
public class User {
     private int customerId;
     private String customerName;
}
//订单类  
public class Orders {
    private int orderId;
    private String orderName;
    private Customer customer;
}
//一对多映射
<many-to-one name="user" class="User">
  <!--指定外键列-->
  <column name="customer_id" />
</many-to-one>

  7.  双向一对多  最常用

    代码表示:

//在多的一方
public
class Orders { private int orderId; private String orderName; private Customer customer; }
//在一得一方,添加一个含多的一方的集合,可以是set或者list
public class Customer { private int customerId; private String customerName; private List<Orders> orders=new ArrayList<Orders>(); }
//在多的一方
<many-to-one name="customer" class="Customer">
  <!--指定外键列-->
  <column name="customer_id" />
</many-to-one>
//在一的映射文件里,set用set标签,list用bag标签
     <!-- 1对多的双向映射 -->
<bag name="orders" table="orders">
  //指定外键表的外键列名
  <key colum="customer_id" />
  //指定list集合里的对象类型
  <one-to-many class="Orders"/>
</bag>
  //set和bag的常用属性:
           //inverse="true":在双向一对多的映射中,集合这端,默认是双向维护关联,这样会引起效率问题, 一般在集合这端,加入此属性,放弃维护,让多的那端主动维护
           //
cascade="delete"设置允许级联删除 ,常常不用。一般在程序去做判断
           //order-by 对集合的结果排序
            //order-by="字段名 asc"
 

    8.多对多映射

    

两个表的多对多关系,通过第3张中间表来实现
在hibernate中,只需写好 多 vs 多的映射关系,会自动帮我们生成中间表

多对多,集合属性的映射:

<!-- 多对多映射集合 -->
<!-- table -> 中间表名字 -->
<bag name="courses" table="STUDENT_COURSE">
<!-- 指定本类,在中间表中的外键名称 -->
<key>
<column name="STU_ID"></column>
</key>
<!-- 本类的集合属性,对应的类,在中间表中,外键的名字 -->
<many-to-many class="Course" column="C_ID"></many-to-many>
</bag>

另外的类,写法真好互补

<bag name="students" table="STUDENT_COURSE">
<key>
<column name="C_ID"></column>
</key>

<many-to-many class="Student" column="STU_ID"></many-to-many>
</bag>

    

     






  

原文地址:https://www.cnblogs.com/zDr-zHy/p/4918587.html