代码改变世界

hibernate入门基础

2009-08-19 23:35  Jvpy  阅读(285)  评论(0编辑  收藏  举报
为什么引入hibernate?
模型不匹配:Java是面向对象的语言,对象模型,其主要概念有:继承/关联/多态等;数据库是关系模型,其主要概念有:表/主键/外键等。
解决办法?
• 使用JDBC手工转换。
• 使用ORM(Object Relation Mapping对象关系映射)框架来解决,主流的ORM框架有Hibernate/TopLink/OJB。

使用Hibernate需要具备的包:
hibernate_home\hibernate3.jar和hibernate_home\lib\下的如下包:
antlr.jar, cglib.jar, asm.jar, commons-collections.jar, commons-logging.jar, jta.jar, dom4j.jar
同时导入dom4j.jar和log4j.jar会导致如下错误:
1 log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment).
2 log4j:WARN Please initialize the log4j system properly.
解决办法:把log4j.properties放到类路径下
log4j.properties

开发配置

配置文件hibernate.cfg.xml和hibernate.properties,两个文件的作用一样,提供一个即可,推荐xml格式的。
hibernate_home\etc下是示例配置文件。
可以在配置文件中指定:
数据库的URL/用户名/密码/JDBC驱动类/方言(dialect)等。
启动时hibernate会在classpath中寻找这个配置文件。

映射文件(*.hbm.xml,对象模型和关系模型的映射)。在hibernate_home\eg下有完整的hibernate示例。

实例
工程结构

将hibernate_home\hibernate3.jar和hibernate_home\lib下的jar文件导入到工程中。

Domain Object User.java为实体对象,一个普通的Java bean
User.java
Domain Object的限制:
• 该类中必须得有一个不带参数的ctor。
• 有标志符id与数据库的主键进行映射(可选)。
• 该类不要设置成final类型,对懒加载有影响(可选)

映射文件的作用是将User对象与数据库表建立映射关系,一般命名格式为*.hbm.xml
User.hbm.xml
该配置文件在domain object的角度看待问题,缺省的类名和表名是一样的,可以通过table属性指定。

配置文件
hibernate.cfg.xml

测试代码
Base.java

问题及原因
抛出异常:org.hibernate.HibernateException: Hibernate Dialect must be explicitly set
错误原因:其实并不是没有对dialect进行设置,而是在使用hibernate的时候,没有调用配置文件,导致系统不能读出dialect信息。
解决办法:
Code

• 如果没有开启事务,并且hibernate能成功更新了数据库,则应该在mysql中查看数据库表的创建方式是否有问题:
1 show create table user;
正常的显示如下:
Code

之所以错误是因为engine不是InnoDB,这个引擎具有回滚功能。用show engines命令可以查看mysql支持的engine.

上面的测试代码不太规范,优化的写法如下:
添加一个工具类用于进行hibernate初始化(耗时的过程,只需要做一次)
HibernateUtil.java

这时添加用户的操作可以这么写:
Base.java