Hibernate对象-关系映射基础
1、Hibernate中持久化类的访问者有两个(从保存和查询两条路线看)
注意:Java应用程序不能访问持久化类的private方法,而hibernate没有这个限制,它可以访问各种级别的方法。
2、基本数据类型和包装类型区别
基本数据类型和包装类型对应的hibernate映射类型相同。
基本类型可直接运算、无法表达null、数字类型的默认值为0。
包装类默认值是null。当对于默认值有业务意义的时候需要使用包装类。
3、Hibernate访问持久化类属性的策略
a) propertye 默认值:表明hibernate通过getXXX和setXXX来访问类属性。推荐使用。提高域模型透明性。
b) field:hibernate通过java反射机制直接访问类属性。对于没有javabean方法的属性可设置该访问策略。
c) noop:它映射Java持久化类中不存在的属性,即主要用于HQL(用query接口测试,使用hql语句)中,当数据库中有某列,而实体中不存在的情况。(不需要了解)
1 <!-- 该属性在Customer类中不存在get和set方法 --> 2 <property name="name" column="name" type="string" access="field" /> 3 4 5 <!-- 该属性在Customer类中不存在,但在数据库存在该字段 6 使用noop处理 查询的时候忽略该字段--> 7 <property name="name" column="name" type="string" access="noop"/>
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE hibernate-mapping PUBLIC 3 "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 4 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 5 <hibernate-mapping> 6 <class name="cn.zengfansheng.access.Customer" table="customers"> 7 <id name="id" type="integer"> 8 <column name="id"></column> 9 <generator class="increment"/> 10 </id> 11 <!-- 12 access:表示访问策略 默认值是property 13 * property:表明hibernate通过getXXX和setXXX来访问类属性 14 * field:hibernate通过java反射机制直接访问类属性。对于没有javabean方法的属性可设置该访问策略。 15 16 --> 17 <property name="name" type="string" access="field"> 18 <column name="name"></column> 19 </property> 20 <property name="age" type="integer"> 21 <column name="age"></column> 22 </property> 23 24 <property name="des" type="text"> 25 <column name="des"></column> 26 </property> 27 </class> 28 </hibernate-mapping>
4、在持久化类的方法中加入程序逻辑
在Customer.hbm.xml文件中无需映射firstname和lastname属性,而是映射name属性。
尽管类中并没有name属性,由于hibernate不是直接访问Name属性,而是调用get、set方法,因此建立了Firstname、Lastname和表之间的联系。
5、设置派生属性
利用<property>元素的formula属性,用来设置一个sql表达式,hibernate将根据它来计算出派生属性的值。
1 在customer类中增加两个属性 2 * private Double price; 3 * private Double totalprice;//在数据库中没有对应的列 4 5 在Customer.hbm.xml文件中增加如下配置 6 <property name="price" column="price" type="double"/> 7 <property name="totalprice" formula="(select sum(o.price) from customer o)"/> 9 10 注意:在sql语句中使用别名,派生属性中使用的是sql语句
6、控制insert、update语句
7、处理sql引用表示符
在SQL语法中,表示符是指用于为数据库表、视图、字段或索引等名字的字符串,常规表示符不包括空格,也不包含特殊字符,因此无需使用引用符号。
如果数据库表名或列名包含特殊字符,可以使用引用表示符(键盘~下面的字符)。
1 类中增加 2 private String des; 3 映射文件增加 4 <property name="des" column="`customer des`“ type="text"/>
8、设置类的包名
如果在一个映射文件中包含多个类,并且这些类位于同一个包中,可以设置<hibernate-mapping>元素的package属性,避免为每个类提供完整的类名。
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE hibernate-mapping PUBLIC 3 "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 4 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 5 <hibernate-mapping package="cn.zengfansheng.property"> 6 <class name="Customer" table="customers" dynamic-update="true"> 7 <id name="id" type="integer"> 8 <column name="id"></column> 9 <generator class="increment" /> 10 </id> 11 <property name="name" type="string"> 12 <column name="name"></column> 13 </property> 14 <property name="age" type="integer"> 15 <column name="age"></column> 16 </property> 17 <property name="des" type="text"> 18 <column name="des" ></column> 19 </property> 20 </class> 21 </hibernate-mapping>