Hibernate bean 对象配制文件

Hibernate bean 对象配制文件


class Person{

    private int pid;
}
1 配制主键
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>

    <class name="cn.Person" table="t_person">
        <!-- 主键 -->
        <id name="pid">
            <generator class="native"></generator>
        </id>
    </class>

</hibernate-mapping>
  • class 相关设置
    name 对应的bean数据类对象路径  例如这里使用的是 cn 包下的 Person类 

    table 对应的表的名称 
    select-before-update="true" 这个属性的时候 
    在进行更新的操作,会先进行查询操作,如果数据有改变那么就进行更新操作,如果数据没有改变,就不进行更新操作 

    在判断是否进行了修改,其是判断的是快照缓存区
    class 可设置动态 insertupdate,默认值:false

    dynamic-insert="true" 如果生产insert语句,属性内容为null,生产的sql语句中将没有该字段。

    dynamic-update="true" 只有内容被修改才进行更新。默认更新所有。
        注意:如果使用动态更新,数据必须是查询获得的,此时修改的内容将被更新,其他内容不变。
    class 设置懒加载  
    lazy = "true" 默认为true
  • 主键配制说明
<id></id> 标签中 可设置相关的属性
属性名对应值
nameOID 属性名称 也就是对应对象名称
column表字段列名
access确定访问属性或字段
length表字段长度
type表字段类型
unsaved-valuesave或update方法使用依据 String ,默认null,如果使用unsaved-value=”abc” ,当执行save方法,设置“abc”相当之前null
    generator 标签
    主键生成策略,hibernate根据设置生成OID的值方案
                                                      
                                                                                                                                                                                                                                                                                                                                                                                                   
generator标签 class对应名称class 对应值 案例
1 incrementhibernate 自己维护表的数据自动增强,在执行insert语句执之前,先查询。
会有:高并发、或集群 存放问题。
2 identity hibernate 将使用数据库底层自动增强,如 mysql quto-increment
3 sequence hibernate 将使用数据库底层序列。例如:oracle 序列
4 hilo hibernate采用高低位算法(不支持自动增强,也不支持序列) 例 4
hilo标签下 table ,设置数据库中,另一个表A的表名。
hilo标签下 column,表A的列名
hilo标签下 max_lo,一次操作多少条记录。100表示可以允许一次操作100条记录。
hilo标签下 算法:max_lo * next_value + next_value
5 native 根据底层数据库的能力选择 identity、sequence 或者 hilo 中的一个
提示以上5个类型要求:整形(long, short 或者 int)
6 uuid随机字符串32长度
提示以上6种OID值都是有hibernate自动生成:代理主键
7 assigned自然主键,生成手动设置。例如身份证
  • 例 4
<generator class="hilo">
            <param name="table">hi_value</param>
            <param name="column">next_value</param>
            <param name="max_lo">100</param>
</generator>


2 配制其他属性
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>



    <class name="cn.Person" table="t_person">

        <property name="name" 
                  length="50" 
                  column="name"   
                  type="string" 
                  access="property">
        </property>

    </class>


</hibernate-mapping>
  • property 相关设置
    <property> 可以设置,允许当前属性是否在sql语句中 。默认值:true

    insert="false" 表示生产insert语句,没有当前字段。
    update="false" 表示生产update语句,没有当前字段。

    案例 : 
    <property name="title" insert="false" update="false"></property>
  • name : 默认用于配置javabean属性名称
  • length : 配置长度,字符串默认255,mysql类型 varchar(255)
  • column : 当前属性对应表中字段(列)名称,默认name的值
方式1:column属性(attribute) , <property column="">
方式2:子标签 <property> <column name="name"></column>
  • type: 数据字段类型
    方式1:hibernate类型,例如:string
    方式2:java类型,例如:java.lang.String
    方法3:mysql类型,例如:varchar(50)
            <column name="name" sql-type="varchar(50)" />
    日期时间类型
            date , 日期  java.util.Date , 对应jdbc类型:java.sql.Date
            time , 时间  java.util.Date , 对应jdbc类型:java.sql.Time
            timestamp,时间戳 java.util.Date (注意:时间戳随着数据更改变化) , 对应jdbc类型:java.sql.Timestamp
    项目使用:
            字符串、long (date.getTime())、日期时间类型
            使用数据的datetime 表示日期时间。

  • access ,用于确定当前属性如何进行数据封装
    property : 默认值,hibernate采用javabean属性 与 表字段进行对应。在javabean必须提供 getter/setter方法
    field : hibernate采用 javabean 字段 与 表字段进行对应。 可以没有getter/setter方法
            例如:private String username;
    noop : 提供给hibernate hql使用,数据库没有对应字段。一般不使用。
    precision 和 scale 给 oracle配置,在mysql没有作用。
                  precision 配置数字位数
                    scale 配置小数位数 
                    例如:numeric(precision,scale)  , 12.34  numeric(4,2)


3 多对一配制
方案一 
  • 多方的配制
//name属性为当前订单中的名称 
//calss 为多对一 中 一所代表的对象
//column 为多对一 之间联系的外键 
<many-to-one 
        name="customer" class="com.Customer" column="customer_id">
</many-to-one>

  • 一方的配制
    //name 代表本类中属性
    //inverse 属性默认为false,设置为true,代表 一方不去对 多方进行维护 
    <set name="orderSet" inverse="true">
        //key 标签中确定 一对多 之间的联系外键 
        <key column="customer_id"></key>
        //one-to-many 标签代表 一对多的 目标类
        <one-to-many class="com.Order"/>

    </set>
方案二 
  • 多方的配制
//name属性为当前订单中的名称 
//calss 为多对一 中 一所代表的对象
//column 为多对一 之间联系的外键 
<many-to-one 
        name="customer" class="com.Customer" column="customer_id">
</many-to-one>

  • 一方的配制

清单配制

    //name 代表本类中属性
    //cascade 
    <set name="orderSet" cascade="save-update">
        //key 标签中确定 一对多 之间的联系外键 
        <key column="customer_id"></key>
        //one-to-many 标签代表 一对多的 目标类
        <one-to-many class="com.Order"/>

    </set>
 cascade 
    设置为none , 没有级联操作

 cascade 
    设置为 save-update,级连保存或者更新 当save一方的时候,如果这时关联了瞬时态的多方,那么将触发级联操作,将瞬时态的多方转为持久态,也就是多执行了一次insert,最后再执行update

cascade 
    设置为 delete,级连删除 当删除一方的时候,会同时去删除其所关联的多方  

cascade  设置为 delete-orphan,孤儿删除 

    例如在  客户与订单  一对多,一个客户对应多条订单 

    当我们移除客户的一条订单的时候,Hibernate 默认方式是将订单从表中的对应的订单数据的外键置为了null,当我们设置了 column=" delete-orphan " 时,Hibernate会先将订单从表中的对应的订单数据的外键置为Null,再执行删除操作

cascade  设置为 all,代表 可以拥有 save-updatedelete 总和


cascade  设置为 all-delete-orphan,代表 所有    
4 多对多配制
  • 一方的配制
<set name="studentSet" table="t_student_course">
            <key column="course_id"></key>
            <many-to-many class="com.Student" 
                column="student_id">
            </many-to-many>
</set>
  • 另一方的配制
<set name="courseSet" table="t_student_course">
            <key column="student_id"></key>
            <many-to-many class="com.Course" 
                        column="course_id">
            </many-to-many>
        </set>
  • 说明
多对多需要中间表来建立对应,set标签下的table就是用来设置中间表的名称的

key 标签是用来设置本类在中间表就对应的列
many-to-many 标签 中,calss 对应的另一方的类,colum 对应的另一方在中间表中对应的列
  • 注意

在一对多 和多对多关系映射中 可设置 fetch 属性,与lazy属性

fetch="join" ,lazy无效,hibernate 将使用“迫切左外连接”,底层执行sql语句就是“左外连接”
        只执行一条select,将当前对象及关联对象数据一次性查询出来。


fetch="select" ,默认值,执行多条select语句
        lazy="false" 立即执行,在执行get方法时,立即执行多条select语句。
        lazy="true" 延迟执行,在执行get方法时先查询客户Customer,直到使用Order数据时才查询Order
        lazy="extra" 极其懒惰,在执行get方法时先查询客户Customer(select t_customer),如果需要order 订单数,将执行聚合函数只查询数量(select count() t_order),如果需要详情再查询详情(select t_order))。


fetch="subselect" ,采用子查询
        lazy 取值与 fetch="select" 相同。
        注意:必须使用Query进行查询

5 类中组件配制

使用 component 标签

public class Person {

    private Integer pid;    //OID 值
    private String name;

    //组合
    private Address homeAddress;
    private Address companyAddress;

}

public class Address {
    //值对象 (vo 值对象/po 持久对象/bo 业务对象)

    private String addr;
    private String tel;

}

<hibernate-mapping>
    <class name="com.Person" table="t_person">
        <id name="pid">
            <generator class="native"></generator>
        </id>
        <property name="name"></property>

        <component name="homeAddress" class="com.Address">
            <property name="addr" column="homeAddr"></property>
            <property name="tel" column="homeTel"></property>
        </component>

        <component name="companyAddress" class="com.Address">
            <property name="addr" column="companyAddr"></property>
            <property name="tel" column="companyTel"></property>
        </component>

    </class>

</hibernate-mapping>
6 继承映射配制
  • 继承关系类描述
public class Employee {

    private Integer eid;
    private String name;

}


public class HourEmployee extends Employee {

    private int rate;   //零钱

}


public class SalaryEmployee extends Employee {

    private int salary;

}
  • 方式一 使用 sub-class 标签来处理
    所有的内容都保存在一张表中 
<hibernate-mapping>
    <class name="com.Employee" table="t_employee" discriminator-value="员工">
        <id name="eid">
            <generator class="native"></generator>
        </id>
        <discriminator column="etemp"></discriminator>
        <property name="name"></property>

        <subclass name="com.SalaryEmployee" discriminator-value="正式员工" >
            <property name="salary"></property>
        </subclass>
        <subclass name="com.HourEmployee" discriminator-value="小时工">
            <property name="rate"></property>
        </subclass>

    </class>

</hibernate-mapping>
  • 方式二 使用joined-subclass 标签来处理
    每个子类都有一张表 

<hibernate-mapping>
    <class name="com.Employee" table="j_employee">
        <id name="eid">
            <generator class="native"></generator>
        </id>
        <property name="name"></property>

        <joined-subclass name="com.HourEmployee" table="j_hour">
            <key column="hid"></key>
            <property name="rate"></property>
        </joined-subclass>
        <joined-subclass name="com.SalaryEmployee" table="j_salary">
            <key column="sid"></key>
            <property name="salary"></property>
        </joined-subclass>

    </class>

</hibernate-mapping>
    eid 是j_employee表中的主键,同时关联着从表j_hour中主键rate  与从表 j_salary 中主键 sid
  • 方式三 使用union-subclass 标签来处理
    每个子类都有一张表 
    所有的子类 与 父类 共用主键策略

<hibernate-mapping>
    <class name="com.Employee" table="u_employee">
        <id name="eid">
            <generator class="increment"></generator>
        </id>
        <property name="name"></property>

        <union-subclass name="com.HourEmployee" table="u_hour">
            <property name="rate"></property>
        </union-subclass>

        <union-subclass name="com.SalaryEmployee" table="u_salary">
            <property name="salary"></property>
        </union-subclass>

    </class>

</hibernate-mapping>
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

早起的年轻人

创作源于分享

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值