本文主要是学习hibernate的对象关系映射文件中一些字段属性的作用
1、在<hibernate-mapping>元素中,<meta> <import> <class> <query>等子元素可以不存在,或者存在一次或多次;在<class>元素中<id>元素必须存在且只能存在一次,<property>元素可以不存在或者存在多次,而且<id>元素必须在<property>元素之前定义
1)指定类的文档 <meta attribute="class-description">abc</meta>
2)指定类的继承关系<meta attribute="extends">classA</meta>,这种写法会导致<hibernate-mapping>元素中所有的<class>都继承classA,若想设定某个<class>继承A,可以将<meta attribute="extends">classA</meta>放置在<class>元素中,
3)指定类属性的访问级别在<class>元素中定义<meta attribute="scope-field">protected</meta>针对该类的所有属性,在<property>定义只针对该属性
2、如何处理映射文件,实体类,数据库表三种类型的对应关系
比如实体类中属性类型为String在数据库表中代表的类型有可能是varchar或者text,这个时候映射文件必须显示的说明对应的类型是什么,类似下面的处理
<property name="address" column="address" type="text" />
默认是通过属性的get/set方法来访问即access=“property”,但是通过access属性的设置也可以指定通过field方式来访问,此方式不需要get/set方法,如下方法:
<property name="name" type="string" column="name" access=“field” />
1)比如实体类中定义了firstname和lastname属性,没有name属性,但对象关系映射文件使用的是name字段和数据库的name字段对应,我们可以在实体类中定义一个getName和setName的方法,然后在这两个方法中分别去设置firstname和lastname的值,因为我们知道hibernate默认不会直接设置name属性,而是会调用getName和setName方法来完成实体类和数据库记录的转换,但若修改了属性的访问策略为"field",则在生成实体类的时候,hibernate会有异常抛出,PropertyNotFindException。最后需要注意的是,hibernate的sql语句中出现的字段,必须是对象关系映射文件中定义的字段。
2)比如实体类中定义了total属性,我们可以设置这个属性在获取实体时,自动调用sql语句获取结果设置给属性,如下方式:
<property name="totalPrice" formula="(select sum(o.price) from orders o where o.cid=cid)">
</property>
hibernate在初始化阶段会根据对象关系映射文件生成sql语句缓存在sessionfactory中,默认情况下sql语句包含了表的所有字段,但是通过设置可以改变这一行为,如下:
<property name="address" column="address" type="string" update=“false” />
这样在更新的时候,数据库的address字段就不会被更新到,insert也是相同的道理。insert和update的属性控制还可以作用于<class>元素上他们的默认值是true;除了insert和update,还有dynamic-insert和dynamic-update,他们的默认值为false,当设置为true时,即每次insert和update都动态的生成sql语句,而且只操作那些属性非空和需要更新的字段