博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hibernate——对象/数据库映射
阅读量:6007 次
发布时间:2019-06-20

本文共 2124 字,大约阅读时间需要 7 分钟。

hot3.png

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

 

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

转载于:https://my.oschina.net/tiancai/blog/83483

你可能感兴趣的文章
【数据库】快速掌握云数据库MySQL版
查看>>
第一章 老虎Linux简介
查看>>
CSS 框模型
查看>>
领域驱动设计DDD实战进阶第一波(五):开发一般业务的大健康行业直销系统(实现产品上下文领域层)...
查看>>
Linux环境Cloudera CDH安装配置完全解决方案
查看>>
Linux 4.x MTD源码分析-cfi-flash设备probe过程分析
查看>>
程序员因一张嵌套7层的循环代码截图被开除!
查看>>
满足用户的即时需求,金融云的效率优先与生态开放
查看>>
命令行基础
查看>>
三栏布局(两边固定,中间自适应) 常用方案及演变过程
查看>>
Vue嵌套组件的生命周期
查看>>
PHP 加密
查看>>
10月前端面试题目汇总
查看>>
【JAVA】Srping和传统JDBC实现数据库操作
查看>>
Redux-状态管理器
查看>>
mui扩展插件mui.showLoading加载框
查看>>
leetcode 122 买卖股票的最佳时机 II
查看>>
阿里云ons队列监控api深度使用
查看>>
Vue 基础篇(三):Vue生命周期理解
查看>>
区块链技术开发:场外交易为什么必不可少?
查看>>