本文共 3245 字,大约阅读时间需要 10 分钟。
映射一对多关联关系 在关系数据库中,只存在外键参照关系,而且总是由"many"方参照"one"方,因为这样才能消除数据冗余, 因此关系数据库实际上只支持多对一或一对一的单向关联。 在配置文件中"多的"一方对应"一的"一方,属性不可以用<property>来配置 e.g.<many-to-one name="customer" column="CUSTOMER_ID" class="com.shaogq.relational.one2more.Customer" not-null="true" lazy="false" cascade="save-update" /> 说明: <many-to-one>元素建立了customer属性和ORDERS的外键CUSTOMER_ID直接的映射。它包含以下属性: name:设定待映射的持久化类的属性的名字,此处为Order类的customer属性。 column:设定和持久化类的属性对应的表的外键,此处为ORDERS表的外键CUSTOMER_ID。 class:设定待映射的持久化类的属性的类型,此处设定customer属性为Customer类型。 not-null:该属性的默认值为false,如果为true,表示customer属性不允许为null。not-null属性会影响hbm2ddl工具生成的数据 库Schema。hbm2ddl工具会为ORDERS表的CUSTOMER_ID外键设置not null约束,但not-null属性不会影响hbm2java工具 生成Java源代码。此外,not-null属性还会影响Hibernate的运行时行为,Hibernate在向数据库中保持Order对象时,会 先检查它的customer属性是否为null。 lazy:如果为proxy,表示对关联的Customer对象使用延迟检索策略并且使用代理,这是默认值。 如果为false,就意味着当Hibernate从数据库中加载Order时,还会立即自动加载与它关联的Customer对象。 cascade:如果为save-update,表名保存或更新当前对象(insert/update)时,会级联保存或更新与它关联的对象。默认值为none。 映射一对多双向关联关系 Hibernate要求在持久化类中定义集合类属性时,必须把属性声明为接口类型,如java.util.Set,java.util.Map和java.util.List。 声明为接口可以提高持久化类的透明性,当Hibernate调用setOrders(Set orders)方法时,传递的参数是Hibernate自定义的实现类实例。 private Set orders = new HashSet();提高代码健壮性,避免NullPointerException 参数配置方法: <set name="orders" cascade="save-update" inverse="true"> <key column="CUSTOMER_ID"/> <one-to-many class="com.shaogq.relational.one2more.Order"/> </set> <set>元素包括以下属性: name:设定待映射的持久化类的属性名,这里为Customer类的orders属性。 cascade:当取值为"save-update",表示级联保存和更新, 当取值为"delete"时表示级联删除, 当取值"all"代表两个都有, 当取值"all-delete-orphan"时,表示关联双方存在父子关系,由父方控制子方的声明周期,子方不允许单独存在。 默认值为"none"。当需要删除父方并删除与子类关系时使用,这时inverse="false" inverse:对立,即是否维护关系,默认为false。则“一的”一方维护关系。双向一对多应该又多的一方维护关系,则应该设置为inverse="true" 子元素<key>:设定与所关联的持久化类对应的表的外键,此处为ORDERS表的CUSTOMER_ID字段 子元素<one-to-many>:设定所关联的持久化类,此处为Order类。 映射一对多双向自身关联关系 映射一对多双向自身关联关系时,仍应该有多的一方维护关系及<set>中inverse="true", 为了保证会维护关系,所以要将多的一方中的父节点赋值。 同时为了保持只需要保存根节点全部都保存,也需要将子节点保存进去(在级联的时候才会保存)。 所以只有一种配置方式 <class name="com.shaogq.relational.one2more2myself.Category" table="CATEGORY"> <id name="id" column="ID" type="java.lang.Integer"> <generator class="native"/> </id> <property name="name" column="NAME" type="java.lang.String"/> <many-to-one name="parentCategory" column="CATEGORY_ID" class="com.shaogq.relational.one2more2myself.Category" not-null="false" cascade="save-update" /> <set name="childCategories" cascade="save-update" inverse="true" > <key column="CATEGORY_ID"/> <one-to-many class="com.shaogq.relational.one2more2myself.Category"/> </set> </class> cascade属性说明: cascade属性值 描述 none 当通过Session操纵当前对象时,忽略其他关联对象。它是cascade属性的默认值。 save-update 当通过Session的save()、update()及saveOrUpdate()方法来保存或更新当前对象时,级联保存所有关联的 新建的临时对象,并且级联更新所有关联的游离对象。 persist 当通过Session的persist()方法来保存当前对象时,会级联保存所有关联的新建的临时对象。 merge 当通过Session的merge()方法来融合当前对象是,会级联融合所有关联的游离对象。 delete 当通过Session的delete()方法删除当前对象时,会级联删除所有关联的对象。 lock 当通过Session的lock()方法把当前游离对象加入到Session缓存中时,会把所有关联的游离对象也加入到Session缓存中。 replicate 当通过Session的replicate()方法复制当前对象时,会级联复制所有关联的对象。 evict 当通过Session的evice()方法从Session缓存中清除当前对象时,会级联清除所有关联的对象。 refresh 当通过Session的refresh()方法刷新当前对象时,会吉林刷新所有关联的对象。所谓的刷新是指读取数据库中相应数据, 然后根据数据库中的最新数据去同步更新Session缓存中的相应对象。 all 包含save-update,persist,merge,delete,locak,replicate,evict及refresh的行为。 delete-orphan 删除所有和当前对象接触关联关系的对象。 all-delete-orphan 包含all和delete-orphan的行为。转载地址:http://rtyci.baihongyu.com/