hibernate映射文件详解

这篇文章详细介绍了Hibernate映射文件(.hbm.xml)的结构,特别是class元素如何定义Java类与数据库表的映射,包括主键生成策略、属性访问方式、派生属性、字段插入和更新控制以及动态插入和更新的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



hibernate映射文件

映射文件在.hbm.xml文件中编写

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- 根元素 -->
<hibernate-mapping>
    <!--
        dynamic-update 动态修改    仅修改需要更新的字段
        dynamic-insert 动态插入    只会插入不为null的字段
     -->
  	<!-- class标签用来定义java类到数据库表的映射关系 -->
    <class name="com.zhanghe.study.model.User" table="user" dynamic-update="true" dynamic-insert="true">
        <cache usage="read-write"/>
        <id name="id" type="java.lang.Integer">
            <column name="id"/>
            <!-- 指定主键生成方式  navive 使用数据库本地方式 -->
            <!-- 主键生成方式
             increment Hibernate一递增的方式赋值  先查该表的id最大值,再加一   存在并发问题
             identity  由底层数据库生成,需要把主键设置为自增的
             sequence  底层数据库序列生成
             hilo  由hibernate按照一种high/low算法生成,从数据库中特定表的字段中获取high值
             native  根据底层数据库对自动生成主键的支持能力,来选择identity,sequence或hilo生成器
            -->
            <generator class="native"/>
        </id>
        
        <!--
            access  表示属性访问策略,默认为property,使用getter/setter来访问赋值
                    field  使用反射访问成员变量

            unique   是否为唯一约束
            update   表示该字段是否能修改
            index    索引
            length   长度
         -->
        <property name="name" type="java.lang.String" not-null="true" access="property">
            <column name="name"/>
        </property>
        <property name="age" type="java.lang.Integer">
            <column name="age"/>
        </property>

    </class>
</hibernate-mapping>

配置访问持久化类属性的策略

可以在property元素中配置access属性来指定hibernate访问持久化类属性的方式

  • property 默认值,使用getter/setter方法来访问类的属性,不需要管有没有该成员变量

  • field 使用java的反射机制来直接访问类的属性

<property name="customerName" type="java.lang.String" access="property">
            <column name="customer_name"/>
 </property>

设置派生属性

有些属性的值需要在运行时进行计算才可以获取到,此时可以使用property元素的formula属性,该属性用来设置一个SQL表达式,hibernate根据SQL来计算出派生属性的值

<property name="totalPrice" formula="(select sum(price) from orders where custom_id=id)"></property>

在查询的时候就会进行拼接子查询来获取该属性的值

select id,name,(select sum(price) from orders where custom_id=1) from customer where id = 1;

控制字段的插入和更新

hibernate生成的save()、update()语句默认是插入和更新全部的字段,可以进行自定义设置

  • property元素的insert属性 默认为true,如果设置为false,表示insert语句中不包含该字段
  • property元素的update属性 默认为true,如果设置为false,表示update语句中不包含该字段
  • class元素的mutable属性 默认为true,如果设置为false,等价于该类下所有的property元素的update属性为false,整个实例都不可以被更新
  • class属性的dynamic-insert属性 默认为false,如果为true,表示当保存一个对象时,会动态的生成insert语句,仅包含取值不为null的字段
  • class属性的dynamic-update属性 默认为false,如果为true,表示当更新一个对象时,会动态的生成update语句,仅包含需要更新的字段

注意:当表的字段比较多时,可以设置dynamic-insert、dynamic-update来提升性能

参考文献

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

拾光师

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值