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

    xiaoxiao2021-03-25  90

    先来个栗子:

    <?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  点击打开链接

    最后、送你山清水秀

    转载请注明原文地址: https://ju.6miu.com/read-19648.html

    最新回复(0)