hibernate问题(本文供个人学习成长之用)

Hibernate基础知识:

在了解hibernate之前要先简单了解一下jdbc:

1)jdbc简介:

JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序,同时,JDBC也是个商标名。(以上这段话来自百度百科)

1.1)jdbc连接各种数据库的方法:(摘自“设计前沿收集”)

1.1.1)oracle8/8i/9i数据库(thin模式)

//加载驱动
	Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
	//下边的jdbc表示此URL遵循jdbc规范,oracle表示连接的库是oracle的,thin表示一种连接模式,localhost表示库的ip
	//地址,1521是端口号,orcl表示具体数据库的名字
	String url = "jdbc:oracle:thin:@localhost:1521:orcl";
	String username = "";//用户名
	String password = "";//密码
	//连接数据库
	Connection conn = DriverManager.getConnection(url,username,password);
1 .1.2)DB2数据库:

//加载驱动
	Class.forName("com.ibm.db2.jdbc.app.DB2Driver").newInstance();
	//下边的jdbc表示此URL遵循jdbc规范,db2表示连接的库是db2的,localhost表示库的ip
	//地址,5000是端口号,sample表示具体数据库的名字
	String url = "jdbc:db2://localhost:5000/sample";
	String username = "";//用户名
	String password = "";//密码
	//连接数据库
	Connection conn = DriverManager.getConnection(url,username,password);

1.1.3)Sql Server7.0/2000数据库

//加载驱动
	Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance();
	//下边的jdbc表示此URL遵循jdbc规范,sqlserver表示连接的库是sqlserver数据库,localhost表示库的ip
	//地址,1433是端口号,Mydb表示具体数据库的名字
	String url = "jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=Mydb";
	String username = "";//用户名
	String password = "";//密码
	//连接数据库
	Connection conn = DriverManager.getConnection(url,username,password);


1.1.4)Sybase数据库

//加载驱动
	Class.forName("com.sybase.jdbc.SybDriver").newInstance();
	//下边的jdbc表示此URL遵循jdbc规范,sybase表示连接的库是sybase数据库,localhost表示库的ip
	//地址,5007是端口号,Mydb表示具体数据库的名字
	String url = "jdbc:sybase:Tds:localhost:5007/Mydb";<span style="color: rgb(51, 51, 51); font-family: Arial, Helvetica, sans-serif; text-indent: 28px;">//连接数据库</span><span style="color: rgb(51, 51, 51); text-indent: 28px; font-family: Arial, Helvetica, sans-serif;">Connection conn = DriverManager.getConnection(url,pro);</span>

 
 
1.1.5)Informix数据库 

//加载驱动
	Class.forName("com.informix.jdbc.IfxDriver").newInstance();
	String url = "jdbc:informix-sqli://localhost:1533/MyDB:INFORMIXSERVER=myserver;user=username;password=passw";
	//连接数据库
	Connection conn = DriverManager.getConnection(url);

 
 
1.1.6)MySQL数据库 

//加载驱动
	Class.forName("org.gjt.mm.mysql.Driver").newInstance();
	String url = "jdbc:mysql://localhost/MyDB?user=username&password=passw&useUnicode=true&characterEncoding=8859_1";
	//连接数据库
	Connection conn = DriverManager.getConnection(url);

 
 
1.1.7)PostgreSQL数据库 

//加载驱动
	Class.forName("org.postgresql.Driver").newInstance();
	String url = "jdbc:postgresql://localhost/sample;
	String username = "";//用户名
	String password = "";//密码
	//连接数据库
	Connection conn = DriverManager.getConnection(url,username,password);


2)Hibernate简介

Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。(该段描述来自百度百科)

简单说来,hibernate的主要功能是封装了jdbc。主要用于连接数据库,对数据库进行一些持久化的操作等。

2.1)hibernate中存在两种xml文件:

一种是hibernate.cfg.xml文件,另一种是xxx.hbm.xml文件。

2.1.1)在hibernate.cfg.xml配置文件中主要包含以下信息:

a)连接数据库时用到的一些信息;

b)hibernate框架本身的一些设置;

c)对实体类进行映射的映射文件的路径

该文件的默认存放位置src下边。这样的好处是,将来hibernate会自动的去读取src下面的一个叫hibernate.cfg.xml的文件。  我们是可以修改其名字和路径的,只不过修改完之后要把新的名字和路径传给hibernate才行。

2.1.2)映射文件xxx.hbm.xml文件的作用:

a)描述实体类的属性与数据库中表字段的对应关系以及表与表之间的关系(通过外键);

在该文件中标签<id>表示对主键的映射,标签<property>是对其他属性的映射。

该文件一般放在跟它所映射的类同级的目录下。

2.2)hibernate中几个重要的类和接口的作用:

2.2.1)org.hibernate.cfg.Configuration类

作用:

a)读取配置文件hibernate.cfg.xml文件;

b)创建sessionFactory对象

2.2.2)org.hibernate.SessionFactory接口

作用:

a)产生Session接口的实现类对象;

只有Configuration类正确读取了hibernate.cfg.xml文件后,才能创建出SessionFactory接口的实现类对象。

sessionFactory接口的实现类对象,在一个使用hibernate框架的项目中,只需要有一个这样的对象就可以。

2.2.3)org.hibernate.Session接口:

作用:

a)完成代码与数据库之间的交互;

在hibernate中,如果没有session对象,那么任何的数据库操作都做不了。

2.2.4)org.hibernate.Transaction接口:

作用:

a)每一个Transaction对象就是一个事物对象,完成对事物的操作

在使用session操作数据之前,要先去开启一个事物,并把这个事物对象返回。

2.3)在hibernate中把实体类对象分为三类(关于hibernate的三大状态的详解可以参考“学习java之旅”的博客,地址:http://blog.sina.com.cn/s/blog_ae50b9570101axfo.html):

a)transient:表示自由状态或者叫瞬时状态,当你new出一个对象的时候,这个新对象就处于自由状态。

其特点就是:只在代码里有,缓存里没有,数据库中没有。

b)detached:游离状态或托管状态,

特点:代码里有,数据库里有,缓存里没有

c)persistent:持久化状态

特点:代码里有,缓存里有,数据库里也有。

2.4)hibernate中的锁:

主要解决了不可重复读的问题,两种锁:悲观锁,乐观锁。

2.4.1)悲观锁:

hibernate中的悲观锁是利用数据库中的所机制实现的,比如:在oracle中的sql语句中的for update,for update nowait。

Select * from teacher where id= 1 for update;
Select * from teacher where id= 1 for update nowait;

2.4.2)乐观锁:

依靠hibernate中的一些设置和配置来完成。

如果在hibernate中把事物的隔离级别设为最高,我们就没有必要设置hibernate的锁机制了,但是这样设置后,执行效率低。所以

我们一般会设置为read-committed,这样既能解决脏读又有一定的效率,只是在这种设置下,会有不可重复读的问题(幻读不考虑)。所以

我们在hibernate中可以用锁机制来解决问题。

2.5)事物的隔离级别:

a)read-uncommitted:意思是不提交也能读,但什么也解决不了(sqlserver支持)

b)read-committed:提交后才能读,解决了脏读,但另两个问题(不可重复读和幻读)可能出现(oracle和sqlserver支持)

c)repeatable-read:解决了脏读和不可重复读(sqlserver支持)

d)serializable:全部解决,但执行效率低(oracle支持,sqlserver支持)

这四个级别由低到高,但等级越高,执行效率越低。

注:并不是所有数据库都支持这四种隔离级别,mysql中都支持,oracle中的默认级别是read-committed。

2.6)事物引起的一些问题:

a)脏读:一个事物读取到另一个事物中修改过但还没提交过的数据。即读到了一个不正确的数据(主要发生在update中)

b)不可重复读:一个事物a在第一次读取事物和第二次读取事物期间,有另一个事物b把这个数据修改并提交了,导致事物a两次读取的数据不一致(主要发生在update操作中)

c)幻读:一个事物a按一定条件获取了数据后,另一个事物b删除了或插入了一些符合查询条件的数据。这样当事物a再一次查询时发现少了或是多了一些数据。(主要发生在insert和delete操作中)

2.7)hibernate中的缓存:

两种:一级缓存;二级缓存。

a)一级缓存是session级别的缓存

b)二级缓存是SessionFactory级别的缓存

默认情况下,二级缓存是不能使用的,如果要使用,需要一些配置之后,才能启动:

配置二级缓存的步骤:

a)把需要的两个jar包导入到项目中:

commons-logging.jar

ehcache-1.2.3.jar

b)把ehcache.xml文件直接复制到src下边

c)在hibernate.cfg.xml中配置二级缓存:

<property name="cache.use_second_level_cache">true</property>

d)在hibernate.cfg.xml中配置二级缓存的提供者:

<!-- 配置二级缓存的提供者 -->
    <property name="cache.provider_class">true</property>

e)配置ehcache.xml文件,如果不配置,使用默认的也可以

f )在某个类的hbm.xml文件即实体类的映射文件中配置,使其将来可以放在二级缓存里

<cache usage="read-write"/>

2.8)查询缓存(针对hql语句查询)

查询默认是关闭的,使用查询缓存需要在hibernate.cfg.xml文件中进行配置,查询缓存依赖于二级缓存,在代码里面使用query查询之前,需要设置一下使用查询缓存:query.setCacheable(true).list();


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值