Hibernate作为数据访问层,它通过配置文件(hibernate.properties或hibernate.cfg.xml)和映射文件(***.hbm.xml)把JAVA对象或PO(PersistentObject,持久化对象)映射到数据库中的数据库,然后通过操作PO,对数据表中的数据进行增,删,改,查等操作。
第一个配置文件hibernate.properties我没有用过,现在Hibernate一般是交给Spring管理,多用applicationContex.xml配置文件管理。
第二个(***.hbm.xml)文件,它是hibernate与数据库的对象关系映射文件。结合具体实例,分析实体间的关系,在配置文件中是如何体现的吧。
一般说来,一个(***.hbm.xml)文件,代表了一个实体Model类和一个数据库table的关联,如下:
<span style="font-size:18px;"><hibernate-mapping> <class name="myShop.category.vo.Category" table="category"> </class> </hibernate-mapping> </span>
这表明class类myShop.category.vo.Category对应表category;
现在有另外一个类CategorySecond,它和Category类是多对一的关系:
Category.hbm.xml配置文件
<span style="font-size:18px;"><hibernate-mapping> <class name="myShop.category.vo.Category" table="category"> <!-- 主键的生成策略 --> <id name ="cid"> <generator class="native"/> </id> <property name="cname"/> <!-- 配置二级分类的集合 --> <set order-by="csid" name="categorySeconds" lazy="false" inverse="true" cascade="delete"> <key column="cid"/> <one-to-many class="myShop.categorysecond.vo.CategorySecond"/> </set> </class> </hibernate-mapping> </span>
CategorySecond.hbm.xml配置文件
<span style="font-size:18px;"><hibernate-mapping> <class name="myShop.categorysecond.vo.CategorySecond" table="categorysecond"> <id name="csid"> <generator class="native"/> </id> <property name="csname"/> <!-- 二级分类与一级分类的关联 --> <many-to-one name="category" lazy="false" class="myShop.category.vo.Category" column="cid"></many-to-one> </class> </hibernate-mapping> </span>
结合上述2个配置文件,分析Hibernate-mapping配置文件。
在“一”的一方,配置文件中将会配置set节点信息:
Lazy:默认是true使用延迟加载,false表示不延迟加载(即时加载);
Order-by:一的一方set集合内多的一方实体集合的排序方式默认是主键排序 但可以更改;
Inverse:反转。True表示由对方负责控制,false表示由自己控制。true可以减少update语句,提高性能。
Cascade:是否使用级联操作;属性值:
all:所有情况下均进行关联操作,即save-update和delete。
none:所有情况下均不进行关联操作。这是默认值。
save-update:在执行save/update/saveOrUpdate时进行关联操作。
delete: 在执行delete时进行关联操作。
all-delete-orphan:当一个节点在对象图中成为孤儿节点时,删除该节点。比如在一个一对多的关系中,Student包含多个book,当在对象关系中删除一个book时,此book即成为孤儿节点。
如果想要实现级联删除,只需配置“一”的一方的set节点: inverse="true"cascade="delete",这样删除“一”的一方后,在多的一方中引用到一的一方的主键的全部记录也会被删除。