您的位置:首页 > 其它

Hibernate 第一个例子 详解

2013-01-07 14:24 218 查看
创建一个Java工程,导入架包如图:



Hibernate体系结构图:





User.java:

package com.pojo;

public class User implements java.io.Serializable {
	private Integer id;
	private String name;
	private Integer age;

	public Integer getId() {
		return this.id;
	}
	private void setId(Integer id) {
		this.id = id;
	}
	
	public String getName() {
		return this.name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
	public Integer getAge() {
		return this.age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}

}

解析:

你可以看到这个类对属性的存取方法(getter and setter method)使用了标准 JavaBean 命名约定,同时把类属性(field)的访问级别设成私有的(private)。这是推荐的设计,但并不是必须的。Hibernate 也可以直接访问这些 field,而使用访问方法(accessor method)的好处是提供了重构时的健壮性(robustness)。

对一特定的 user,
id
属性持有唯一的标识符(identifier)的值。如果我们希望使用 Hibernate 提供的所有特性,那么所有的持久化实体(persistent entity)类(这里也包括一些次要依赖类)都需要一个这样的标识符属性。而事实上,大多数应用程序(特别是 web 应用程序)都需要通过标识符来区别对象,所以你应该考虑使用标识符属性而不是把它当作一种限制。然而,我们通常不会操作对象的标识(identity),因此它的 setter
方法的访问级别应该声明 private。这样当对象被保存的时候,只有 Hibernate 可以为它分配标识符值。你可看到Hibernate可以直接访问 public,private 和 protected 的访问方法和 field。所以选择哪种方式完全取决于你,你可以使你的选择与你的应用程序设计相吻合。

所有的持久化类(persistent classes)都要求有无参的构造器,因为 Hibernate 必须使用 Java 反射机制来为你创建对象。构造器(constructor)的访问级别可以是 private,然而当生成运行时代理(runtime proxy)的时候则要求使用至少是 package 级别的访问控制,这样在没有字节码指令(bytecode instrumentation)的情况下,从持久化类里获取数据会更有效率。



数据库“pla”下建表"user":



解析:此表表名与User类同名,首写字母大小写随意。

User.hbm.xml:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- 
	Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
	<!--指定类和对象的表-->
	<class name="com.pojo.User" table="user" >
		<!--指定主键-->
		<id name="id" type="java.lang.Integer">
			<!--对应的表字段-->
			<column name="id" />
			<!--定义主键生成方式Hibernate自行决定-->
			<generator class="native" />
		</id>
		<!--定义name字段-->
		<property name="name" type="java.lang.String">
			<column name="name" length="20" />
		</property>
		<!--定义age字段-->
		<property name="age" type="java.lang.Integer">
			<column name="age" />
		</property>
	</class>
</hibernate-mapping>

解析:

这是映射文件。Hibernate 需要知道怎样去加载(load)和存储(store)持久化类的对象。这正是 Hibernate 映射文件发挥作用的地方。映射文件告诉 Hibernate 它应该访问数据库(database)里面的哪个表(table)及应该使用表里面的哪些字段(column)。

hibernate.cfg.xml:

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
          "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
          "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<!-- Generated by MyEclipse Hibernate Tools.                   -->
<hibernate-configuration>

<session-factory>
	<property name="dialect">
		org.hibernate.dialect.MySQLDialect
	</property>
	<property name="connection.url">
		jdbc:mysql://localhost:3306/pla
	</property>
	<property name="connection.username">root</property>
	<property name="connection.password">root</property>
	<property name="connection.driver_class">
		com.mysql.jdbc.Driver
	</property>
	<property name="myeclipse.connection.profile">MySQL5</property>
	<mapping resource="com/pojo/user.hbm.xml" />

</session-factory>

</hibernate-configuration>

解析:

有了持久化类和它的映射文件,现在是配置 Hibernate的时候了。在这里,我们配置了 Hibernate 的
SessionFactory
— 一个关联于特定数据库全局的工厂(factory);注意"session-factory"这个取名,也正是配置了sessionfactory才可以在下面用config.buildSessionFactory()去调出SessionFactory。如果你要使用多个数据库,就要用多个的
<session-factory>
,通常把它们放在多个配置文件中(为了更容易启动)。Hibernate
将为你的应用程序连接到数据库。注意最后的<mapping>标签,它的生成方法如下图:



TestHibernate1.java:

package com.test;

import org.hibernate.*;
import org.hibernate.cfg.Configuration;

import com.pojo.User;

import junit.framework.TestCase;

public class TestHibernate1 extends TestCase {
          public void test1(){
        	Transaction tr=null;
      		// 1 建立持久化对象(实体类对象)
      		User user = new User();
      		user.setName("测试");
      		user.setAge(new Integer(30));
      	   //2 创建一个Configuration对象,默认去加载 src 下 hibernate.cfg.xml文件
      		Configuration config=new Configuration().configure(); 
        	//3 得到一个SessionFactory对象(从工厂中造session)
      		 try {
				SessionFactory factory=config.buildSessionFactory();
				 //4 得到一个session对象
				 Session session=factory.openSession();
				 //5 hibernate默认事务自动提交是关闭的
				 tr=session.beginTransaction();
				 //6 保存数据到数据库
				 session.save(user);
				 //7 提交事务,否则数据库中不会增加记录。只有提交事务,数据才会提交
				 tr.commit();
			} catch (HibernateException e) {
				e.printStackTrace();
				tr.rollback();//遇异常用回滚事务
			}
          }
}

解析:

以上是一个

,用于方便测试,按照以上源码中注释的7个步骤进行代码编写。



最后的运行结果:


,数据库pla的表user中多了一条记录。

注意:在使用MyEclipse作为开发工具时,运行Hibernate应用都会显示一些警告,提示没有配置Log4j,这是因为项目的lib中有Log4j类库,但是开发都没有配置Log4j的属性文件,可从Hibernate的安装包的project\etc目录下找到log4j.properties配置文件,复制到项目的src路径中即可。这时可以在日志中看到JDBC执行的SQL语句和相关运行过程,如:14:53:18,913
DEBUG SQL:346 - insert into user (name, age) values (?, ?)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: