商城之SSH框架中的.hbm.xml文件

前端之家收集整理的这篇文章主要介绍了商城之SSH框架中的.hbm.xml文件前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

先来个栗子:

<?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.itcast.shop.order.vo.Order" table="orders">
		<id name="oid">
			<generator class="native"/><!--主键-->
		</id>
		<!--字段-->
		<property name="total"/>
		<property name="ordertime"/>
		<property name="state"/>
		<property name="name"/>
		<property name="phone"/>
		<property name="addr"/>
		
		<!-- 订单与用户关联配置 -->
		<many-to-one name="user" lazy="false" class="cn.itcast.shop.user.vo.User" column="uid"/>
	
		<!-- 订单与订单项关联配置 -->
		<set name="orderItems" lazy="false" cascade="save-update">
			<key column="oid"/>
			<one-to-many class="cn.itcast.shop.order.vo.OrderItem"/>
		</set>
	</class>
</hibernate-mapping>

上面的表没有什么好说的,下面的关联配置开始的时候不懂也没有想懂,但是最近这块报错了
cannot delete or update a parent row :a foregin key constraint fails('shop'……

所以就先看一下数据库,查到了lazy、cascade、还有inverse,诶、搞得小菜我头都大了,其实也没什么,进入正题吧:

lazy

延迟加载保证了应用只有在需要时才去数据库中抓取相应的记录。通过延迟加载技术可以避免过多、过早地加载数据表里的数据,从而降低应用的内存开销

当代理类实例或代理集合处于持久化状态时,才能初始化它。如果在游离状态时才初始化它,就会产生延迟初始化错误;如果在获取对象的时候使用的是session.get()是不会延迟加载的,只有在使用load、hql时候才会延迟加载。

Hibernate中<class lazy=””>默认为true,在load的时候只会返回一个代理类,并不会正在从数据库中读取数据。

第一次用到时,会将所有普通属性(set这种就不是)全部加载进来。

如果第一次使用到时,session已经关闭将发生错误

设置lazy=false(立即加载),load的时候即会把所有普通属性全部读取进来。返回的将是一个真正的该类型的对象

关联实体

多个实体时(包括一对多、多对多):

此时关联实体将以集合的形式存在,Hibernate 将使用 PersistentSet、PersistentList、PersistentMap、PersistentSortedMap、PersistentSortedSet 等集合来管理延迟加载的实体。

单个实体时(包括一对一、多对一):当 Hibernate 加载某个实体时,延迟的关联实体将是一个动态生成代理对象。

使用 <many-to-one.../> 或 <one-to-one.../> 映射关联实体的情形,这两个元素也可通过 lazy 属性来指定延迟加载。点击打开链接

延迟加载与立即加载

如果程序加载一个持久化对象的目的是为访问他的属性,则可以采用立即加载。

如果程序加载一个持久化对象的目的仅仅是为了获得他的引用,则可以采用延迟加载。

cascade/Inverse

Cascade代表是否执行级联操作,Inverse代表是否由己方维护关系。

Cascade

当主控方执行操作时,关联对象(被动方)是否同步执行同一操作
如,User 类中有一Address属性,User和Address 是一对多的关系,然后当user.save(address);的时候,user就是主控方了

取值:

all 所以情况均关联;反之 none(默认值
save-update:执行save、update、saveOrUpdate时
对象的id是unsaved-value,这个对象不是persistence object要save(insert);
id非unsaved-value,这个对象是persistence object(库中已存),update就行
delete:执行delete时
all-delete-orph:变成孤立节点时,删除该节点

inverse

属性默认是false的,就是说关系的两端都来维护关系=false 的为主动方,由主动方负责维护关联关系

一对多:属性在多的一方

应在一方的设置 inverse=true ,多的一方设置 inverse=false(可不设置,默认值false),说明关联关系由多的一方来维护。原因:该关联关系的属性在多的一方的表中,在维护关联关系的时候在多的一方容易维护:减少update语句,提高性能

  多对多:

属性在独立表中。任意一方设置inverse=true,另一方inverse=false;

如果两个多设置为false的话,两方都对关联关系表进行同样的维护:如更新则需要更新两次

为true:则为对方主控,只有两个实体(表)都操作才能触发对表的操作

  一对一:是一对多的一个特例

inverse 的设置也是一样的,主要还是看关联关系的属性在哪一方,这一方的inverse=false。

  多对一:也就是一对多的反过来 点击打开链接 深度好文、特详细

总结

级联(cascade)就是操作一个对象时,对它的属性(其cascade=true)也进行这个操作

当inverse=true时,不执行sql;当inverse=false时,执行sql 点击打开链接

最后、送你山清水秀

猜你在找的XML相关文章