Hibernate4 : 持久化你的第一个类
由于目前我在学校的一个实验室跟老师学习Java EE开发,老师用的是Seam框架接活做项目,所以这一系列的文章将会向Seam方向写。。路线大致应该是 : JSP --> Servlet --> Hibernate --> JSF --> EJB3 --> Seam
在开始之前,去www.hibernate.org下载 hibernate4.final.zip ,并将所有依赖的jar文件放到classpath下
一、Hibernate简介
持久化,是指将内存中的数据保存到可以永久存储数据的高设备中,如硬盘。
Hibernate是一个开放源代码的对象关系映射(ORM)框架,它对JDBC进行了轻量级的封闭,使得程序员能从繁杂的JDBC操作中彻底解放出来。Hibernate使用hibernate.cfg.xml完成数据库的配置,使用 *.hbm.xml文件定义从对象到数据库的映射规则。
数据库的配置 : hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- MySql JDBC驱动类 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- MySql DB用户密码 -->
<property name="hibernate.connection.password">0000</property>
<!-- MySql 连接URL -->
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/test</property>
<!-- MySql DB用户名 -->
<property name="hibernate.connection.username">root</property>
<!-- MySql JDBC方言 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 在控制台打印自动生成的SQL语句 -->
<property name="hibernate.show_sql">true</property>
<!-- 实例Bean映射定义文件 -->
<mapping resource="dev/entity/UserBean.hbm.xml"/>
</session-factory>
</hibernate-configuration>
<mapping resource="dev/entity/UserBean.hbm.xml"/>是指定映射规则文件的路径。UserBean.hbm.xml定义了从UserBean这个类到关系数据库的映射规则。该文件应该放在与UserBean.class 同级的目录下。UserBean这个实例bean定义如下:
package dev.entity; public class UserBean
{
private int id; //用做主键
private String name;
private String pwd; //省略get和set方法
}
我们要做的就是将UserBean这个类存储到数据库的一张名叫USERBEAN的表中。UserBean的每个属性都对应着数据表中的一个字段。首先创建USERBREAN数据表:
create table USERBEAN
(
ID int key auto_increment,
NAME varchar(40),
PWD varchar(40)
);
注意,主键 ID字段必须设置成auto_increment,即自增类型。下面通过UserBean.hbm.xml来定义从类到数据库的映射规则。
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated Jun 29, 2013 2:13:53 PM by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
<class name="dev.entity.UserBean" table="USERBEAN">
<id name="id" type="int">
<column name="ID" />
<generator class="native" />
</id>
<property name="name" type="java.lang.String" length="40">
<column name="NAME" />
</property>
<property name="pwd" type="java.lang.String" length="40">
<column name="PWD" />
</property>
</class>
</hibernate-mapping>
关于这些xml文件的说明,可以查看官方文档。上面的xml应该很容易理解,如table属性指的就是表名,id元素定义了主键等等。这里不再说明
好了,一切准备就绪,下面就开始持久化我们的第一个类吧!
二、使用Hibernate持久化类的流程
构造Configuration对象 --> 构造ServiceRegistry对象 --> 得到SessionFactory对象 -->使用SessionFactory得到Session对象。
得到Session对象后,首先要调用beginTransaction()方法来打开一个事务,然后调用save()方法将UserBean的实例做为参数传递进去,再调用Transaction的commit()方法提交事务,这时候UserBean对象才会被保存到数据库中。如果调用完save()方法后没有调用commit(),则不会进行任何的保存工作,只有当事务关闭或者调用了flush方法后才会真正地将对象持久化。
package dev; import java.rmi.registry.Registry; import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder; import dev.entity.*; public class Main
{ /**
* @param args
*/
public static void main(String[] args)
{
// TODO Auto-generated method stub
Configuration cfg = new Configuration().configure(); //加载配置文件
ServiceRegistry registry = new ServiceRegistryBuilder().applySettings(cfg.getProperties())
.buildServiceRegistry(); //在得到SessionFactory之前要先进行注册,Hibernate4新特性 SessionFactory factory = cfg.buildSessionFactory(registry);
Session session = factory.openSession(); //开启一个session //填充实例bean
UserBean user = new UserBean();
user.setId(1);
user.setName("bruce");
user.setPwd("1234567"); session.beginTransaction(); //开始一个事务
session.save(user); //保存实例对象
session.getTransaction().commit(); //提交事务,user会被持久化
session.close();
} }
注意,如果使用的是Hibernate3或之前的版本,则不需要注册这一步,即main方法中第二行代码可以省略,cfg.buildSessionFactory()方法不需要参数。
运行程序,持久化完成。
Hibernate4 : 持久化你的第一个类的更多相关文章
- Hibernate4 拦截器(Interceptor) 实现实体类增删改的日志记录
		
转自:https://blog.csdn.net/he90227/article/details/44783099 开发应用程序的过程中,经常会对一些比较重要的数据修改都需要写日志.在实际工作的工程中 ...
 - java进阶之反射:反射基础之如何获取一个类以及如何获取这个类的所有属性和方法(2)
		
当我们知道一个类的对象,或者知道一个类的路径,或者指导这个类的名称的时候我们可以获取到这个类的类对象 当我们仅仅知道一个类的类对象的时候我们依然无法操作这个类,因为我们不知道这个类的属性,类的方法.那 ...
 - Java中是否可以调用一个类中的main方法?
		
前几天面试的时候,被问到在Java中是否可以调用一个类中的main方法?回来测试了下,答案是可以!代码如下: main1中调用main2的主方法 package org.fiu.test; impor ...
 - [转]自己写PHP扩展之创建一个类
		
原文:http://www.imsiren.com/archives/572 比如我们要创建一个类..PHP代码如下 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ...
 - 重写toString()方法来描述一个类
		
package com.zch.test; /* toString方法以及重写toString方法 toString方法是一个自我描述方法 方法本身返回的是该对象的实现类的 类名 + @ + hash ...
 - Java中的一个类怎么调用另一个类中的方法
		
如果另一个类中的那个方法是私有的话,就不能直接调用到,如果是其他类型的话看情况,如果是静态的(static)话,直接用类名可以调用到,如果是非静态的,就需要利用另一个类的实例(也就是用那个类生成的对象 ...
 - 22.编写一个类A,该类创建的对象可以调用方法showA输出小写的英文字母表。然后再编写一个A类的子类B,子类B创建的对象不仅可以调用方法showA输出小写的英文字母表,而且可以调用子类新增的方法showB输出大写的英文字母表。最后编写主类C,在主类的main方法 中测试类A与类B。
		
22.编写一个类A,该类创建的对象可以调用方法showA输出小写的英文字母表.然后再编写一个A类的子类B,子类B创建的对象不仅可以调用方法showA输出小写的英文字母表,而且可以调用子类新增的方法sh ...
 - 35.按要求编写Java程序: (1)编写一个接口:InterfaceA,只含有一个方法int method(int n); (2)编写一个类:ClassA来实现接口InterfaceA,实现int method(int n)接口方 法时,要求计算1到n的和; (3)编写另一个类:ClassB来实现接口InterfaceA,实现int method(int n)接口 方法时,要求计算n的阶乘(n
		
35.按要求编写Java程序: (1)编写一个接口:InterfaceA,只含有一个方法int method(int n): (2)编写一个类:ClassA来实现接口InterfaceA,实现in ...
 - Java基础-接口.编写2个接口:InterfaceA和InterfaceB;在接口InterfaceA中有个方法void printCapitalLetter();在接口InterfaceB中有个方法void printLowercaseLetter();然 后写一个类Print实现接口InterfaceA和InterfaceB,要求	方法 实现输出大写英文字母表的功能,printLowerca
		
#34.编写2个接口:InterfaceA和InterfaceB:在接口InterfaceA中有个方法void printCapitalLetter():在接口InterfaceB中有个方法void ...
 
随机推荐
- Mysql找回管理员password
			
我们使用MYSQL的时候有可能由于种种原因忘记ROOTpassword,假设是那样数据库可能就废掉了.可是今天给大家分享下找回ROOTpassword的方法或者说是在不知道rootpassword的情 ...
 - hdu1869 六度分离(Floyd)
			
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1869 转载请注明出处:http://blog.csdn.net/u012860063?viewmode ...
 - Swift编程语言学习3.1排列
			
Swift 语言提供经典的数组和字典两种集合类型来存储集合数据.数组用来按顺序存储同样类型的数据.字典尽管无序存储同样类型数据值可是须要由独有的标识符引用和寻址(就是键值对). Swift 语言里的数 ...
 - linux下C/C++,多线程pthread《转载》
			
原文网址:http://www.cnblogs.com/xianghang123/archive/2011/08/11/2134927.html ·线程创建 函数原型:int pthread_cr ...
 - 2006 ACM Northwestern European Programming Contest C题(二分求最大)
			
My birthday is coming up and traditionally I'm serving pie. Not just one pie, no, I have a numberN o ...
 - VC调试技巧
			
Visual C++ 的 C 运行时刻函数库标识模板0xCD 已经分配的数据(alloCated Data)0xDD 已经释放的数据(Deleted Data)0xFD 被保护的数据 ...
 - Android实战技巧: ListView之ContextMenu无法弹出
			
问题 Activity中使用了ListView作为布局.当每一列表项中含有默认能获取焦点的子View时有可能会对ListView的某些事件有影响: 1. OnItemClick 2. OnItemLo ...
 - 看来IT技术与军事技术都是相通的——都是对新事物极为敏感的领域
			
这是读到这段时候的感想: 和海军中那些狂热的相信“皇军不可战胜”的大舰巨炮主义者们不同,山口对于与美国开战的主张是持坚定的反对态度的,和山本五十六都做过日本驻美武官的山口都认为一旦与美开战,日本或许能 ...
 - hdu 3290 (简单dfs)
			
题意:没有儿子的节点所结苹果数是节点的编号,有儿子的所结苹果是儿子数量(k+1)/2个,求跟节点的苹果数 直接递归一下,先求出所有儿子的苹果树,在排序,,刚开始以为1就是根节点,根节点不确定,, #i ...
 - IOS中的ViewController 的loadView、viewDidLoad、viewDidUnload
			
由init.loadView.viewDidLoad.viewDidUnload.dealloc的关系说起: 1 init方法 在init方法中实例化必要的对象(遵从LazyLoad思想) init方 ...