Hibernate——对象/数据库映射

关系数据库学最重要的一个理论就是:不要给关键字赋予任何业务意义。由于只要赋予了业务意义,就有可能发生改变,将会为之后的数据库维护形成很是大的开销。 java

 

一、hibernate应用步骤 sql

    在java应用中,使用hibernate包括4步: 数据库

    1)建立hibernate配置文件:hibernate-configuartion app

    2)建立实体类 分布式

    3)建立对象/关系映射文件:hibernate-mapping 函数

    4)使用hibernate API编写访问数据库代码 spa

 

    1.1 建立hibernate配置文件 hibernate

    hibernate配置文件有两种格式,一种是properties格式,一种是xml格式。hibernate配置文件放置在java应用的classpath中。 xml

    1.2 建立实体类 对象

     建立的实体类要符合javaBean规范;hibernate不要求实体类必定要实现Serializable接口,可是若是采用分布式结构,java类要在不一样进程间传递,须要要求实现该接口;hibernate要求持久化类必须实现一个带空参数的构造函数。

  

二、hibernate关系映射

    2.1 访问级别

    Java应用程序不能访问private类型的getXXX()和setXXX()方法,可是hibernate没有此限制,它可以访问任何访问级别的getXXX()和setXXX()方法。

    2.2 基本类型属性和包装类型属性

    hibernate既支持包装类型(如Long,Integer),也支持基本类型。对于持久化类的OID,推荐使用包装类型。这样能够经过持久化类的OID是否为空,判断持久化类的状态。

    2.3 hibernate访问持久化类属性的策略

    在<property>元素中的access属性用于指定hibernate访问持久化类的属性的策略,有两个值:

    1)property:默认值。须要有相应的set方法和get方法。

    2)field:当没有set方法或者get方法时指定该值,让hibernate直接访问属性。

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

    1)在get方法和set方法中加入程序逻辑

        例子:

        public class Customer{

            private String firstName;

            private String lastName;

            public Customer(){

            }

            public String getName(){

               return firstName + “ “ + lastName;

            }

            public void setName(String name){

               StringTokenizer toker =  new StringTokenizer(name);

               firstName= toker.nextToken();

               lastName = toker.nextToken();

            }

        }

   

        create table Customer(

            id long not null primary key,

            name varchar(100) not null

        )

  在以上的例子中,Customer类只有firstName和lastName属性,没有name属性,而数据库中只有name字段。因此在 hibernate-mapping中应该使用<property name=”name” column=”name”/>进行映射。而且在HQL语句中,只能用name做为查询条件,而不能firstName和lastName做为查询 条件。

 

   2)控制insert语句和update语句

   <property>和<class>元素中的属性能够控制insert语句和update语句,主要包括:

   a)<property>中的insert:默认为true,若是为false,在生成的insert语句中不包含该字段,代表该字段永远不能为插入。

   b)<property>中的update:默认为true,若是为false,在生成的update语句中不包含该字段,代表该字段永远不能为更新。

   c)<class>中的mutable:默认为true,若是为false,默认全部<property>中的update为false。

   d)<property>中的dynamic-insert:默认为false。若是为true,只有当该字段值不为null,才会把他包含在自动生成的insert语句中。

   e)<property>中的dynamic-update:默认为false。若是为true,只有当该字段值不为null,才会把它包含在生成的update语句中。

   f)<class>中的dynamic-insert:默认为false。

   g)<class>中的dynamic-update:默认为false

    hibernate生成动态sql的开销很小,因此若是表中包含不少字段,建议将dynamic-insert和dynamic-update字段都设置为true,减小数据库执行sql语句的开销。
相关文章
相关标签/搜索