Hibernate初步部署
下载全套文件: hibernate-release-4.1.7.Final.zip
目录结构
Documentation文件夹下是开发帮助文档
Lib文件夹是开发使用的库,其中该文件夹下面的required目录是开发时必须导入的JAR文件;
Project文件夹是项目源码文件
JDBC与Hibernate的比较:
Hibernate的初步配置部署:
1. 创建web项目
2. 添加响应需要的Hibernate的jar包
3. 创建Java Bean业务实体类
4. 创建实体类映射的配置文件:**.hbm.xml
5. 创建Hibernate的配置文件hibernate.cfg.xml
6. 创建测试类测试hibernate是否配置成功
实体类:UserInfo.java
public class UserInfo
{
private int userid;
private String userName;
private String userPwd;
private Date birthday;
//省略了属性各种get和set方法
//创建含有id的构造函数
public UserInfo(int id)
{
this.userid=id;
}
public UserInfo(int userid, String userName, String userPwd, Date birthday)
{
super();
this.userid = userid;
this.userName = userName;
this.userPwd = userPwd;
this.birthday = birthday;
}
//无参的构造函数是必须要有的
public UserInfo()
{
}
}
实体类的配置文件UserInfo.hbm.xml
(配置文件尽量和实体类名字去的一致方便管理和实体类放在同一个包中)
xml version="1.0"?>
"-//Hibernate/HibernateMapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="entity"> //package包指定实体类的包
<class name="UserInfo" table="luser">
//name指定实体类名 table为数据库中实体类对应的表名如果没有指定就和类名一致
<id name="userid">
<generator class="native"/>
id>
//id标识主键的字段 class=native标识自增长
<property name="userName" column="name" />
//property指定属性的字段,column可以指定数据库中对应字段的名称,如果没有就和实体类的属性名一致
<property name="userPwd" />
<property name="birthday" />
class>
hibernate-mapping>
Hibernate的配置文件hibernate.cfg.xml
"-//Hibernate/HibernateConfiguration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="show_sql">trueproperty>
<property name="format_sql">trueproperty>
<property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialectproperty>
<property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriverproperty>
<property name="hibernate.connection.url">jdbc:oracle:thin:@192.168.3.252:1521:orclproperty>
<property name="hibernate.connection.username">bam1property>
<property name="hibernate.connection.password">bam1property>
<property name="hibernate.hbm2ddl.auto">updateproperty>
<mapping resource="entity/UserInfo.hbm.xml"/>
session-factory>
hibernate-configuration>
测试类Test.java
添加一条数据:
public static void add()
{
//第一步:读取Hibernate的配置文件 hibernamte.cfg.xml文件
Configurationcon=new Configuration().configure();
//第二步:创建服务注册构建器对象,通过配置对象中加载所有的配置信息
ServiceRegistryBuilderregbulider=newServiceRegistryBuilder().applySettings(con.getProperties());
//创建注册服务
ServiceRegistryreg=regbulider.buildServiceRegistry();
//第三步:创建会话工厂
SessionFactorysessionFactory=con.buildSessionFactory(reg);
//第四步:创建数据操作会话
Sessionsession=sessionFactory.openSession();
//创建对象
*/
UserInfohanhan=new UserInfo();
hanhan.setUserName("hanhan313");
hanhan.setUserPwd("123");
hanhan.setBirthday(new Date());
/*
//创建事物
Transactiontran=session.beginTransaction();
//保存数据
session.save(hanhan);
//提交事物
tran.commit();
//关闭对话
session.close();
}
查询一条数据:
创建了session回话后
//查询id为10的userinfo的用户信息
UserInfouser=session.get(UserInfo.class,10);
更新一条数据:
首先查询出数据
UserInfo user=session.get(UserInfo.class,10);
再对user进行数据修改后
再通过获取到session回话
session.update(user)
删除一条数据:
删除数据时将需要删除的id数据包装成对象
比如:
UserInfouser=new UserInfo();
User.setUserId(10);
session.delete(user); //删除时就会自动获取到user中id进行删除
hibernate的流程:
持久化JAVA类必须遵循的原则
1、为类的持久化字段声明访问方法(get/set),Hibernate对JavaBeans风格的属性实行持久化。
2、实现一个默认的构造方法,这样的话Hibernate就可以使用Constructor.newInstance()方法来实例化对象。
3、如果是集合类型的属性,它的类型必须定义为集合的接口,例如:List、Set
4、提供一个标识属性(Identifier property),如果没有该属性,一些功能不起作用,比如:级联更新,session.saveOrUpdate()。
对象的状态:
瞬时(transient):数据库中没有数据与之对应,超过作用域会被JVM垃圾回收器回收,一般是new出来且与session没有关联的对象。
持久(persistent):数据库中有数据与之对应,当前与session有关联,并且相关联的session没有关闭,事务没有提交;持久对象状态发生改变,在事务提交时会影响到数据库(hibernate能检测到)。
脱管(detached):数据库中有数据与之对应,但当前没有session与之关联;托管对象状态发生改变,hibernate不能检测到。