Hibernate映射解析!

本文解析了Hibernate中的映射配置,包括一对一、一对多、多对一等关联关系,并详细介绍了映射文件中的各项属性及主键生成策略。

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

[b]Hibernate映射解析![/b]
<hibernate-mapping package="com.allanlxf.hbn.o2m">
<class name="Order" table="order_o2m">
<id name="id" column="id" type="integer">
<generator class="sequence">
<param name="sequence">order_o2m_seq</param>
</generator>
</id>
<property name="no" column="no" type="string"/>
<property name="owner" column="owner" type="string"/>
<property name="sendDate" column="sdate" type="date"/>
<set name="items" cascade="all-delete-orphan" inverse="true">
<key column="orderid" />
<one-to-many class="Item"/>
</set>
</class>
</hibernate-mapping>
*****************************************************************************************
<一>映射类所在的包;
<hibernate-mapping package="com.allanlxf.hbn.o2m">
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
<二>将类和数据库的表联系起来;
<class name="Order" table="order_o2m">
class name="Order" (实体类的类名)
table="order_o2m" (实体类所对应的表名)
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
<三>主键生成策略;
<id name="id" column="id" type="integer">
name="id" (实体类里的属性名)
column="id" (实体类所对应表中的字段名)
type="integer" (字段名id所属的类型<类中的"int"类型在表中等于"integer"类型>)
______________________________________________________________________________________________
<generator class="sequence">
class="sequence"> (指定主键id生成策略为sequence算法)
______________________________________________________________________________________________
<param name="sequence">order_o2m_seq</param>
name="sequence">order_o2m_seq< (指sequence算法所对应的是库中所创建的order_o2m_seq名)
</generator>
</id> (注:这样的算法是需要在库中创建的,创建方法:create sequence order_o2m_seq)
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
<四>类中的属性和字段之间建立联系;
<property name="no" column="no" type="string"/>
name="no" (类中的属性名)
column="no" (表中的字段名)
type="string" (指定字段名的类型) 注:类型可以省略,因为Hibernate可以自动识别,Data类型必须指名
_______________________________________________________________________________________________
<property name="owner" column="owner" type="string"/> (同上)
<property name="sendDate" column="sdate" type="date"/> (同上)
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
<五>指定一对多关联的对象属性;
<set name="items" cascade="all-delete-orphan" inverse="true">
set name="items" (自身实体类的属性名"items") 注:Order类中的属性Set<Item> items = new HashSet<Item>();此属性起关联作用
cascade="all-delete-orphan" ("cascade"级联的标签,删除主对象)
inverse="true" (inverse="true",维护权在Item手中,于是Hibernate不再发送update语句,而由Item自动取得orderid.)
________________________________________________________________________________________________
<key column="orderid" />
key column="orderid" ("key column"中key标签总是和本身类(Order)主键值相对应)
________________________________________________________________________________________________
<one-to-many class="Item"/>
class="Item" (一对多所关联对象的类名)
_______________________________________________________________________________________________
</set>
</class>
</hibernate-mapping>
*******************************************************************************************
总结:主要针对第五步骤:
现对每个属性具体描述一下:
set name="items"中的"items"其实是一个集合的对象,它是将Item中的条目放到集合中,这里为什么用HashSet方法,而不用list 方法呢?区别是HashSet方法是一种无序排列,排除可重性;而list是有序排列,不排除可重性.
cascade用法,我用了表来表示
================================================================================================================
cascade属性值 || 意义
----------------------------------------------------------------------------------------------------------------
none || 在保存,删除或修改对象时,不考虑对其附属物(关联对象)的操作,这是默认设置
----------------------------------------------------------------------------------------------------------------
save-update || 在保存,更新当前对象时,级联保存,更新附属物(临时对象,游离对象)
----------------------------------------------------------------------------------------------------------------
delete || 在删除当前对象时,级联删除附属物
----------------------------------------------------------------------------------------------------------------
all || 包含save-update和delete的操作
----------------------------------------------------------------------------------------------------------------
delete-orphan || 删除和当前对象解除关系的附属对象
================================================================================================================
inverse="true",如果这个属性设置不是true,那么在实现添加过程中都是一条insert语句加上一条update语句,如果为 true,那么就是由对方去维护,就是说在添加的过程中只用一条insert语句就可以.(inverse="true"一般加在set端,哪边有FK, 就由哪边负责).
key column="orderid",就是在取得Order对象时,通过order_o2m表中的主键id与item_m2o表中的外键orderid进行匹配.
******************************************************************************************
create table order_o2m
(
id number(4) not null,
no varchar2(13),
owner varchar2(20),
sdate date,
primary key(id)
)

create sequence order_o2m_seq;

/**多对一**/
<hibernate-mapping package="com.allanlxf.hbn.o2m">
<class name="Item" table="item_m2o">
<id name="id" column="id" type="integer">
<generator class="sequence">
<param name="sequence">item_m2o_seq</param>
</generator>
</id>
<property name="product" column="product" type="string"/>
<property name="price" column="price" type="double"/>
<property name="amount" column="amount" type="integer"/>
<many-to-one name="order" class="Order" column="orderid"/>
</class>
</hibernate-mapping>
*************************************************************************************
<一>映射类所在的包;
<hibernate-mapping package="com.allanlxf.hbn.o2m">
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
<二>将类和数据库的表联系起来;
<class name="Item" table="item_m2o">
class name="Item" (实体类的类名)
table="item_m2o" (实体类所对应的表名)
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
<三>主键生成策略;
<id name="id" column="id" type="integer">
name="id" (实体类里的属性名)
column="id" (实体类所对应表中的字段名)
type="integer" (字段名id所属的类型<类中的"int"类型在表中等于"integer"类型>)
______________________________________________________________________________________________
<generator class="sequence">
class="sequence"> (指定主键id生成策略为sequence算法)
______________________________________________________________________________________________
<param name="sequence">item_m2o_seq</param>
name="sequence">item_m2o_seq< (指sequence算法所对应的是库中所创建的item_m2o_seq名)
</generator>
</id> (注:这样的算法是需要在库中创建的,创建方法:create sequence item_m2o_seq;)
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
<四>类中的属性和字段之间建立联系;
<property name="product" column="product" type="string"/>
name="product" (类中的属性名)
column="product" (表中的字段名)
type="string" (指定字段名的类型) 注:类型可以省略,因为Hibernate可以自动识别,Data类型必须指名
_______________________________________________________________________________________________
<property name="price" column="price" type="double"/> (同上)
<property name="amount" column="amount" type="integer"/> (同上)
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
<五>指定多对一关联的对象属性;
<many-to-one name="order" class="Order" column="orderid"/>
name="order" (自身实体类中的属性名) 注:Item类中的属性private Order order此属性起关联作用
class="Order" (所关联对象(实体类)的类名)
column="orderid" (orderid是Item表中的字段名(列名),同时也是外键,起关联作用) (注:此外键的创建方法:alter table item_m2o add constraint fk_item_order_m2o foreign key(orderid) references order_o2m(id) )
________________________________________________________________________________________________
</class>
</hibernate-mapping>
*****************************************************************************************
总结:此总结针对步骤三以及步骤五:
步骤三:主要是对ID的生成算法作一些描述.ID的生成算法常用的有以下几种:
"sequence(采用数据库提供的Sequence机制生成主键,适用于支持Oracle数据库);
"identity"(采用数据库提供的主键生成机制,DB2/SQLServer/MySQL);
"increment"(主键按数值逐渐递增.如果在同一个数据库中有多个实例访问,就避免使用,个人认为适合单线程);
"native"(由Hibrenate根据底层数据库自行判断采用identity,hilo和sequence中的一种作为主键生成方式);
"foreign"(使用外部表的字段作为主键);
"uuid.hex"是基于Hibernate128位惟一值产生算法生成十六进制数值.
步骤五:主要阐述一下原理,在Item类中包含了"order"属性(order属性是让Item类与Order类产生关联),然后在item_m2o表中通过orderid(外键)于order_o2m发生关联(item_m2o表的外键是引用了order_o2m主键),order_o2m的实体类是 Order
******************************************************************************************
结合表结构对比分析:
create table item_m2o
(
id number(4) not null,
product varchar2(30),
amount number(5),
price number(6,1),
orderid number(4),
primary key(id)
)

create sequence item_m2o_seq;

alter table item_m2o add constraint fk_item_order_m2o
foreign key(orderid)
references order_o2m(id)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值