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文件中无需映射firstnamelastname性,而是映射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>

 

by hacket
原文地址:https://www.cnblogs.com/hacket/p/3091010.html