zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    APP移动端开发html模板
    javascript使用百度地图api和html5特性获取浏览器位置
    javascript与jQuery的each,map回调函数参数顺序问题
    fiddler操作改到本地
    做54活动总结
    移动端文字垂直居中问题兼容
    ADO。Net(二)——防止SQL注入攻击
    ADO.Net(一)——增、删、改、查
    面向对象(六)——设计模式和委托
    面向对象(五)——类库和五大原则
  • 原文地址:https://www.cnblogs.com/hacket/p/3091010.html
Copyright © 2011-2022 走看看