Hibernate学习笔记

一、持久化类规范(不成文的规范)

1、属性是private,有get,set方法。

2、有无参的构造函数。

3、所有的类都要包含一个id,映射数据库表的主键。

4、所有的类是不可扩展或按 EJB 要求实现的一些特殊的类和接口。

二、load,get方法的区别

1、get()方法用来加载一个对象,是立即加载,如果对应id没有找到对象,则报NullPointExeception。

2、load()方法用来加载一个对象,是延迟加载。当加载一个对象时,不会发送sql语句,得到的只是一个包含实体id值得代理对象,只有当我们使用具体属性的时候, 才会发送SQL语句。当我们使用load()方法加载一个对象时,如果id不存在,只要我们不适用具体属性,啥事没有,不会报异常;当使用具体属性时,报异常,ObjectNotFoundException。

3、关于load()还有一个异常需要注意,LazyInitializationException(懒加载异常)。产生的原因是,因为延迟加载,我们得到的只是一个代理对象,如果在使用具体属性之前,关闭session,此时使用对象的属性,就会报LazyInitializationException异常了。因为session关闭了,没法初始化了。在项目中倾向使用load()。

备注:关于SSH整合。在项目中如何解决懒加载异常这一问题呢,答案就是OpenSessionInViewer,将其配置在web.xml中。

三、乐观锁,悲观锁

1、悲观锁

悲观锁,就是在对数据修改时,保持锁定,直到解除锁定,别人才能修改该数据。悲观锁是依靠数据库的锁机制实现的。

比如:select * from table where id =''' for update;  这就是典型的数据库悲观锁实现。

2、乐观锁

乐观锁,就是在数据中增加一个版本号,取出数据处理时,同时取出版本号,当执行更新时,版本号加1,然后和数据库的版本号对比,如果当前版本号大于数据库版本号,则更新,否则则视为过期数据。

Hibernate在其数据访问引擎中内置了乐观锁实现。

实现方法是:

①、在数据库中设置字段version

②、在.hbm.xml配置文件中配置:<version name="version" column="VERSION" type="java.lang.Integer"/>

③、注意,在配置文件中,version节点必须出现在id节点之后。

 

四、Hibernate中,save(),persisit(),saveOrUpdate()不同之处?

这三个方法都是保存一个对象到数据库中。save()只能insert一条记录。saveOrUpdate()判断记录是否存在,不存在就insert,存在就update。save()返回一个Serializable对象,persisit()返回void。

 

五、Hibernate中的命名SQL查询指的是什么?

命名查询是指用标签在配置文件中定义的一个SQL,可以通过session..getNamedQuery()方法对它就行调用。命名查询使你可以使用一个你所指定的名字拿到的特定的查询。也可以通过注解来定义,在Hibernate中,用@NameQuery来定义一个单个命名查询,用@NameQueries来命名多个查询。

六、Hibernate中的SessionFactory有什么作用?是否是线程安全的?

是用来创建Hibernate的session的工厂,是线程安全的,所以多个线程可以使用同一个SessionFactory。

七、Hibernate中的Session指的是什么? 可否将单个的Session在多个线程间进行共享?

session负责维护与数据库的连接,不是线程安全的,不能在多个线程间共享。

八、Hibernate中sorted collection和ordered collection有什么区别?

sorted collection 是通过java的comporator在内存中进行排序的;ordered collection 是通过order by在数据库中进行排序的。对于数据量比较大的集合,为了避免在内存中排序出现java中的OutOfMemoryError,最好使用ordered collection。

九、可不可以将Hibernate的实体类定义为final类?

可以。但是这种做法不好,因为这样就无法使用代理了。

 

 

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值