• 对象-关系映射基础


    持久化类的属性及访问方法

    Hibernate中持久化类的访问者有两个:

    1.Java应用程序

    2.hibernate(何时调用get、set方法?)

    Java应用程序不能访问持久化类的private方法,而hibernate没有这个限制,它可以访问各种级别的方法。

    基本数据类型和包装类型

    基本数据类型和包装类型对应的hibernate映射类型相同.

    <property name=“price” type=“double” column=“PRICE” />

    基本类型可直接运算、无法表达null、数字类型的默认值为0。

    包装类默认值是null。当对于默认值有业务意义的时候需要使用包装类。

    Hibernate访问持久化类属性的策略

    1.property默认值:表明hibernate通过getXXX和setXXX来访问类属性。推荐使用。提高域模型透明性。

    2.field:hibernate通过java反射机制直接访问类属性。对于没有javabean方法的属性可设置该访问策略。

    <property name=“name” access=“field” />

    除了设置property属性的access为field和property之外还可以自定义访问策略,需要创建实现net.sf.hibernate.property.PropertyAccessor接口的类.然后把类的完整名字

    赋值给<property>元素的access属性

    在持久化类的方法中加入程序逻辑

    class Customer{
         …..
         private String firstname ;
         private String lastname ;
         public String getName(){
               return firstname + “ ” + lastname ;
         }
         public void setName(String name){
                StringTokenizer t = new StringTokenizer(name);
                firstname = t.nextToken();
                lastname = t.nextToken();
         }
    } 

    在customer.hbm.xml文件中无需映射firstname和lastname属性,而是映射name属性。

    <property name =“name” column=“NAME” />

    尽管类中并没有name属性,由于hibernate不是直接访问Name属性,而是调用get、set方法,因此建立了Firstname、Lastname和表之间的联系。

    不管在类中是否存在name属性,只要在Customer.hbm.xml文件中映射了name属性,在hql语句中就能访问他。

    Session.find(“from customer as c where c.name=‘tom’”)

    在customer类的setOrders()方法中加入程序逻辑。

    public void setOrders(Set orders){
        this.orders = orders ;
        calprice();
    }
    
    Public calprice(){
        ……
        setAvgPrice(avgprice);
    }

    在setSex()方法中加入数据验证逻辑

    public void setSex(char sex){
        if(sex != ‘M’ && sex != ‘F’){
              throw new IllegalArgumentException(“Invalid sex”);
        }
        this.sex = sex;
    }

    设置派生属性

      利用<property>元素的formula属性,用来设置一个sql表达式,hibernate将根据它来计算出派生属性的值。

    <property name=“totalprice” 
    formula=“(select sum(o.PRICE) from ORDERS o where o.CUSTOMER_ID=ID)” />
    <property name=“unitprice” formula=“BASE_PRICE*QUANTITY” />

    另一种方案:在映射文件中不映射属性,在set方法中加入程序逻辑。

    控制insert、update语句

    映射属性

    作用

    <property>

     insert属性

    若为false,在insert语句中不包含该字段,该字段永远不能被插入。默认值true。

    <property>

     update属性

    若为false,update语句不包含该字段,该字段永远不能被更新。默认值为true。

    <class>

    mutable属性

    若为false,等价于所有的<property>元素的update属性为false,整个实例不能被更新。默认为true。

    <property>

    dynamic-insert属性

    若为true,保存一个对象时,会生成动态insert语句,只有这个字段取值不为null才会把它包含到insert语句中。默认为false。

    <property>

    dynamic-update属性

    若为true,更新一个对象时,会生成动态update语句,只有这个字段取值不为null才会把它包含到update语句中。默认为false。

    <class>

    dynamic-insert属性

    若为true,等价于所有的<property>元素的dynamic-insert为true,保存一个对象时,动态生成insert语句,语句中仅包含取值不为null的字段。默认false。

    <class>

    dynamic-update属性

    若为true,等价于所有的<property>元素的dynamic-update为true,更新一个对象时,动态生成update语句,语句中仅包含取值不为null的字段。默认false。

    处理sql引用标识符
       在SQL语法中,标识符是指用于为数据库表、视图、字段或索引等命名的字符串,常规标识符不包括空格,也不包含特殊字符,因此无需使用引用符号。如果数据库表名或列名包含特殊字符,可以使用引用标识符。

    <property name=“description” column=“`CUSTOMER DESCRIPTION`” />

    设置类的包名
    如果在一个映射文件中包含多个类,并且这些类位于同一个包中,可以设置<hibernate-mapping>元素的package属性,避免为每个类提供完整的类名。

  • 相关阅读:
    元素居中显示
    文本框 获取焦点 失去焦点 实时监听
    cookie/ localStorage /sessionStorage区别
    h5新增标签
    css3属性中的transform属性
    精简 闭包
    let const定义及用法
    关于arguments映射的问题
    Linux云自动化运维第二课
    下载模版的具体代码
  • 原文地址:https://www.cnblogs.com/wuyudong/p/object-relationship.html
Copyright © 2020-2023  润新知