Hibernate示例
一、 引入
(1)模型不匹配(阻抗不匹配)
Java面向对象语言,对象模型,其主要概念有:继承、关联、多态等;数据库是关联模型,其主要概念有:表、主键、外键等。
(2)解决办法
1、 使用JDBC手工转换
2、 使用ORM(Object Relation Mapping对象关系映射)框架来解决,主流的ORM框架有Hibernate、TopLink、OJB。
二、 安装配置
(1) 下载地址http://www.hibernate.org
(2) 将下载目录/hibernate3.jar和/lib下的hibernamte运行时必须的包加入classpath中:antlr.jar,cglib.jar,asm.jar,commons-collections.jar,commons-logging.jar,jta.jar,dom4j.jar
基本操作总结:
1) 创建一个实体类User
2) 将hibernate所需jar构建到项目中
MySQL的驱动 hibernate3.jar lib/required/所有jar文件 lib/jpa/jar文件
3) 配置文件 hibernate.cfg.xml 或 hibernate.properties
配置的基本信息 驱动 url 用户名 密码 方言(可选 一般能够检测到)自动创建表格 将hibernate工作过成中产生的sql语句显示出来以及映射文件的位置
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql:///demo</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">1234</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.hbm2ddl.auto">create</property>
<property name="hibernate.show_sql">true</property>
<mapping resource="com/hbsi/domain/User.hbm.xml"/><!-- 指定映射文件的位置 -->
</session-factory>
</hibernate-configuration>
4) 映射文件----将实体类映射成二维关系表
命名规范User----User.hbm.xml
<hibernate-mapping
package="com.hbsi.domain">---指定Java实体类的包名
<class name="User" table="user">----说明实体类怎样映射成二维表
<id name="id" column="id">
<generator class="native"/><!-- native主键的生成器 自动增长 -->
</id>
<property name="name" not-null="true"/><!-- 映射普通的java属性 -->
<property name="birthday" not-null="true"/>
</class>
</hibernate-mapping>
5) 写Java代码完成对象的保存
public static void main(String[] args) {
// TODO Auto-generated method stub
//使用Hibernate完成将对象存入表中。
Configuration cfg=new Configuration();
cfg.configure();//用来完成Hibernate的初始化--读取配置文件
//sessionFactory对象---DriverManager
SessionFactory sf=cfg.buildSessionFactory();
//通过sessionFactory得session对象
Session session=sf.openSession();
Transaction tx=session.beginTransaction();
User user=new User();
user.setName("Tom");
user.setBirthday(new Date());
session.save(user);
tx.commit();
session.close();
System.out.println("end");
}
}
可能出现的问题
(1) 驱动找不到
(2) Unknown entity:不认识User实体类。原因在配置文件没有指定映射文件的位置
<mapping resource=”com/hbsi/domain/User.hbm.xml”/>
(3)Table”demo.user” doesnot exist:
Create table user(id int auto_inctrment;name varchar(20); birthday date;)
在配置文件中增加配置:
<property name="hibernate.hbm2ddl.auto">create</property>
Create-drop:在hibernate进行初始化时会创建表,程序运行结束时表格就会被删除
Create:在hibernate初始化时会创建表格。并且会在下一次运行时将原来的删除在建新的。
Update:只是根据映射文件去和数据库中的表对应起来,如果不一致就更新表
Validate:校验映射文件和数据库中的表是不是能够对应起来,不能对应报错,实际中常用。
(4) 表格建好了,但表格中没有记录
Insert session.save(user)
<property name=”show_sql”>true</property>
可能是事务回滚
Transaction tx=Session.beginTransaction();
Tx.commit();