JavaEE学习笔记——2、Hibernate hbm参数设置一览

本文详细解析了Hibernate中的hibernate-mapping配置,涵盖了default-cascade、default-access、default-lazy等默认属性,以及class元素的属性如mutable、lazy、dynamic-update等。此外,还探讨了id、many-to-one、one-to-one等映射关系的配置选项,旨在帮助读者深入掌握Hibernate持久化类的配置与使用。

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

根元素hibernate-mapping

属性

schema:数据库的schema名称

catalog:数据库的catalog名称

default-cascade:默认的级联方式 默认值为none

default-access:默认的属性访问方式 默认值为property,通过getter/setter方法访问属性,若设为field,则会忽略getter/setter方法,通过反射的方式访问属性

default-lazy:对没有指定延迟加载的映射类和集合设定为延迟加载 默认值为true

auto-import:设定此映射文件中是否可以在HQL中使用非完整的类名(不包括包名) 默认值为true

package:此映射文件中类默认的包名

子元素

meta:用于设置类或属性的元数据属性

typedef:定义新的Hibernate数据类型

import:显示的引用一个类,避免在HQL语句中使用全类名

class:定义一个持久类

subclass:在进行多态持久化时定义父类的子类

joined-subclass:定义一个连接子类

union-subclass:定义一个联合子类

query:定义一个HQL查询

sql-query:定义一个SQL查询

filter-def:定义过滤器


class元素

属性

name:持久化类的全名

table:对应的数据库表名 默认值为类名

discriminator-value:子类识别标识 默认值为类名

mutable:表明该类的实例是否是可变的 默认值为false

schema:数据库的schema名称

catalog:数据库的catalog名称

proxy:指定延迟加载代理类

dynamic-update:指定用于update的SQL语句是否动态生成 默认值为false

dynamic-insert:指定用于insert的SQL语句是否动态生成 默认值为false

insert-before-update:设定在Hibernate执行update之前是否通过select语句来确定对象是否确实被修改了,如果该对象的值没有改变,update语句将不会被执行 默认值为false

polymorphism:指定使用多态查询的方式 默认值为implicit

where:指定一个附加的SQL语句的where条件

persister:指定一个Persister类

batch-size:设定批量操作记录的数目 默认值为1

optimistic-lock:指定乐观锁定的策略 默认值为vesion

lazy:指定是否使用延迟加载

entity-name:实体名称 默认值为类名

check:指定一个SQL语句用于Schema前的条件检查

rowid:指定是否支持ROWID

subselect:将不可变的只读实体映射到数据库的子查询中

abstract:用于在联合子类中标识抽象的超类 默认值为false

子元素

meta:设置类或属性的元数据属性

subselect:定义一个子查询

cache:定义缓存的策略

synchronize:定义持久化类所需要的同步资源

comment:定义表的注释

id:映射类中与数据库对应表主键相对应的标识字段(表中为独立字段的主键)

composite-id:映射类中与数据库对应表主键相对应的标识字段(表中为联合字段的主键)

natural-id:声明一个唯一的业务主键

discriminator:定义一个鉴别器

vesion:指定表所包含的附带版本信息的数据

timestamp:指定表中包含时间戳的数据

property:定义一个持久化类的属性

many-to-one:定义对象间的多对一的关联关系

one-to-one:定义对象间的一对一的关联关系

component:定义组件映射

dynamic-component:定义动态组件映射

properties:定义一个包含多个属性的逻辑分组

any:定义any映射类型

map:map类型的集合映射

set:set类型的集合映射

list:list类型的集合映射

bag:bag类型的集合映射

array:array类型的集合映射

primitive-array:primitive-array类型的集合映射

query-list:映射由查询返回的集合

join:将一个类的属性映射到多张表中

sub-class:声明多态映射中的子类

joined-subclass:生命多态映射中的来连接子类

union-subclass:声明多态映射中的联合子类

loader:定义持久化对象的加载器

sql-insert:使用定制的SQL语句执行insert操作

sql-update:使用定制的SQL语句执行update操作

sql-delete:使用定制的SQL语句执行delete操作

filter:定义Hibernate使用的过滤器

query:定义装载实体的HQL语句

sql-query:定义装载实体的SQL语句


id 元素

属性

name:映射类中与主键相对应的属性名

type:主键属性的数据类型

column:主键字段的名称 默认值为属性名称

unsaved-value:判断此对象是否进行了保存

access:Hibernate访问主键属性的策略 默认值为property

子元素

generator:为持久化实例产生一个唯一标识


generator 元素

属性

class:定义实例生成器

increment(递增用于为long,short或者int类型生成唯一标识。只有在没有其他进程往同一张表中插入数据时才能使用。在集群下不要使用。identity 对DB2,MySQL, MS SQL Server, Sybase和HypersonicSQL的内置标识字段提供支持。返回的标识符是long,short 或者int类型的。
sequence (序列 在DB2,PostgreSQL, Oracle, SAP DB, McKoi中使用序列(sequence),而在Interbase中使用生成器(generator)。返回的标识符是long,short或者int类型的。
hilo (高低位使用一个高/低位算法来高效的生成long,short或者int类型的标识符。给定一个表和字段(默认分别是是hibernate_unique_keynext_hi)作为高位值得来源。高/低位算法生成的标识符只在一个特定的数据库中是唯一的。在使用JTA获得的连接或者用户自行提供的连接中,不要使用这种生成器。
seqhilo(使用序列的高低位 使用一个高/低位算法来高效的生成long,short或者int类型的标识符,给定一个数据库序列(sequence)的名字。
uuid.hex 用一个128-bit的UUID算法生成字符串类型的标识符。在一个网络中唯一(使用了IP地址)。UUID被编码为一个32位16进制数字的字符串。
uuid.string 使用同样的UUID算法。UUID被编码为一个16个字符长的任意ASCII字符组成的字符串。不能使用在PostgreSQL数据库中
native(本地 根据底层数据库的能力选择identity,sequence 或者hilo中的一个。
assigned(程序设置 让应用程序在save()之前为对象分配一个标示符。
foreign(外部引用 使用另外一个相关联的对象的标识符。和<one-to-one>联合一起使用。

name:映射类属性的名字

column:对应数据库表的字段名 默认值为属性名

type:字段的类型

update:update操作时是否包含本字段的数据 默认值为true

insert:insert操作时是否包含本字段的数据 默认值为true

formula:定义一个SQL来计算这个属性的值

access:Hibernate访问这个属性的策略 默认值为property

lazy:设置此字段是否采用延迟加载策略 默认值为false

unique:设置该字段值是否唯一 默认值为false

not-null:设置该字段值是否可以为空 默认值为false

optimistic-lock:指定此属性做更新操作时是否需要乐观锁定 默认值为true


set 元素

属性

name:映射类属性的名字

access:Hibernate访问这个属性的策略 默认值为property

table:关联的目标数据库表

schema:目标数据库表的schema名字

catalog:目标数据库表的catalog名字

lazy:是否采用延迟加载

subselect:定义一个子查询

sort:设置排序的类型 默认值为 unsorted不排序 可选值为 natural自然排序、comparatorClass实现接口类作为排序算法 避免与order-by同时使用

inverse:用于标识双向关联中被动的一方 默认值为false

mutable:标识被关联对象是否可以改变 默认值为true

cascade:设置操作中的级联策略 可选值为 all所有操作情况均进行级联、none所有操作情况均不进行级联、save-update执行更新操作时级联、delete执行删除操作时级联、all-delete-orphan被关联对象失去宿主时将其删除

order-by:设置排序规则

where:增加筛选条件

batch-size:延迟加载时,一次读取数据的数量 默认值为1

fetch:设置抓取数据的策略 可选值为 join外连接抓取、select序列选择抓取


one-to-one 元素

属性

name:映射类属性的名字

class:映射的目标类

cascade:设置操作中的级联策略 可选值为 all所有操作情况均进行级联、none所有操作情况均不进行级联、save-update执行更新操作时级联、delete执行删除操作时级联

constrained:表明当前类对应的表与被关联的表之间是否存在着外键约束 默认值为false

fetch:设置抓取数据的策略 可选值为 join外连接抓取、select序列选择抓取

property-ref:设置关联类的属性名,此属性和本类的主键相对应 默认值为关联类的主键

access:Hibernate访问这个属性的策略 默认值为property

formula:绝大多数一对一关联都指向其实体的主键。在某些情况下会指向一个或多个字段或是一个表达式,此时可用一个SQL公式来表示

lazy:指定是否采用延迟加载及加载策略 默认值为proxy通过代理进行关联 可选值为 true此对象采用延迟加载并在变量第一次被访问时抓取、false此关联对象不采用延迟加载

entity-name:被关联类的实体名


many-to-one 元素

属性

name:映射类属性的名字

column:关联的字段

class:关联类的名字

cascade:设置操作中的级联策略 可选值为 all所有操作情况均进行级联、none所有操作情况均不进行级联、save-update执行save和update操作时级联、delete执行删除操作时级联

fetch:设置抓取数据的策略 默认值为select序列选择抓取 可选值为join外连接抓取

update:进行update操作时是否包含此字段

insert:进行insert操作时是否包含此字段


property 元素

属性

property-ref:设置关联类的属性名,此属性和本类的关联相对应 默认值为关联类的主键

access:Hibernate访问这个属性的策略 默认值为property

unique:设置该字段值是否唯一 默认值为false

not-null:设置该字段值是否可以为空 默认值为false

optimistic-lock:指定此属性做更新操作时是否需要乐观锁定 默认值为true

lazy:指定是否采用延迟加载及加载策略 默认值为proxy通过代理进行关联 可选值为 true此对象采用延迟加载并在变量第一次被访问时抓取、false此关联对象不采用延迟加载

not-found:指定外键引用的数据不存在时如何让处理 默认值为exception产生异常 可选值为ignore对不存在的应用关联到null

entity-name:被关联类的实体名

 

many-to-one 元素

属性

column:中间关联表映射到目标关联表的关联字段

class:关联的目标类

fetch:设置抓取数据的策略 默认值为select序列选择抓取 可选值为join外连接抓取

lazy:指定是否采用延迟加载及加载策略 默认值为proxy通过代理进行关联 可选值为 true此对象采用延迟加载并在变量第一次被访问时抓取、false此关联对象不采用延迟加载

formula:绝大多数一对一关联都指向其实体的主键。在某些情况下会指向一个或多个字段或是一个表达式,此时可用一个SQL公式来表示

not-found:指定外键引用的数据不存在时如何让处理 默认值为exception产生异常 可选值为ignore对不存在的应用关联到null

entity-name:被关联类的实体名


formula属性示例:

<?xml version="1.0" encoding="gb2312"?>
<!-- 指定Hiberante3映射文件的DTD信息 -->
<!DOCTYPE hibernate-mapping PUBLIC 
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- hibernate-mapping是映射文件的根元素 -->
<hibernate-mapping package="org.crazyit.app.domain">
	<!-- 每个class元素对应一个持久化对象 -->
	<class name="News" table="news_table">
		<!-- id元素定义持久化类的标识属性 -->
		<id name="id">
			<generator class="identity"/>
		</id>
		<!-- property元素定义常规属性 -->
		<property name="title" not-null="true"/>
		<property name="content"/>
		<!-- 通过formula指定该属性值没有对应的实际数据列
			该属性值将由系统根据表达式来生成-->
		<property name="fullContent"
			 formula="(select concat(nt.title,nt.content) 
			 from news_table nt where nt.id= id)"/> 
	</class>
</hibernate-mapping>

public class NewsManager
{
	public static void main(String[] args) throws Exception
	{
		//实例化Configuration,这行代码默认加载hibernate.cfg.xml文件
		Configuration conf = new Configuration().configure();
		//以Configuration创建SessionFactory
		SessionFactory sf = conf.buildSessionFactory();
		//实例化Session
		Session sess = sf.openSession();
		//开始事务
		Transaction tx = sess.beginTransaction();
//		//创建消息实例
//		News n = new News();
//		//设置消息标题和消息内容
//		n.setTitle("it is title");
//		n.setContent("it is content");
//		//保存消息
//		sess.save(n);
		News n2 = (News)sess.get(News.class , 1);
		//输出fullContent属性值
		System.out.println(n2.getFullContent());
		//提交事务
		tx.commit();
		//关闭Session
		sess.close();
	}
}

对于指定了generated属性的PO,每次Hibernate执行一条insert或update时,Hibernate会立刻执行一条select来获得该数据列的值,并将值赋给该PO。

下面示例与上一个类似,只是fullContent属性值将由DB生成,所以在配置fullContent属性时应指定generated属性。

drop database hibernate;
create database hibernate;
use hibernate;
create table news_table
(
id int auto_increment primary key,
title varchar(255) not null,
content varchar(255),
full_content varchar(255)
);
DELIMITER |
create trigger t_full_content_gen BEFORE INSERT ON news_table
	FOR EACH ROW BEGIN
		set new.full_content=concat(new.title,new.content);
	END;
|
DELIMITER ;

<?xml version="1.0" encoding="gb2312"?>
<!-- 指定Hiberante3映射文件的DTD信息 -->
<!DOCTYPE hibernate-mapping PUBLIC 
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- hibernate-mapping是映射文件的根元素 -->
<hibernate-mapping package="org.crazyit.app.domain">
	<!-- 每个class元素对应一个持久化对象 -->
	<class name="News" table="news_table">
		<!-- id元素定义持久化类的标识属性 -->
		<id name="id">
			<generator class="identity"/>
		</id>
		<!-- property元素定义常规属性 -->
		<property name="title" not-null="true"/>
		<property name="content"/>
		<!-- 为该property指定generated属性为always
			该属性的值由数据库生成,
			而Hibernate会在每次插入、更新之后执行
			select语句来查询到该属性的值 -->
		<property name="fullContent" 
			column="full_content" type="string"
			generated="insert"/>
	</class>
</hibernate-mapping>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值