一、持久化类规范(不成文的规范)
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类?
可以。但是这种做法不好,因为这样就无法使用代理了。