Hibernate——对象/数据库映射

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

 

1、hibernate应用步骤

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

    1)创建hibernate配置文件:hibernate-configuartion

    2)创建实体类

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

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

 

    1.1 创建hibernate配置文件

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

    1.2 创建实体类

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

  

2、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语句的开销。

你可能感兴趣的:(Hibernate)