Hibernate 的一些注意点
1,org.hibernate.id.IdentifierGenerationException: this id generator generates long, integer, short or string,当用sequence作为主键的generator时,主键只能是long, integer, short or string. 当定义表的主键长于number(18)(18的时候是long)是,hibernate自动生成的代码会用BigDecimal对应,这时候不能用sequence generator.
当数据库字段类型定义为NUMBER(1)的时候,hibernate的mapping文件中会对应为boolean类型.
2 Hibernate中有两个极为相似的方法get()与load(),他们都可以通过指定的实体类与ID从数据库中读取数据,并返回对应的实例,但
Hibernate不会搞两个完全一样的方法的,它们间的不同在于:
a,hibernate中get方法和load方法的根本区别在于:如果找不到符合条件的纪录,get()方法将返回null.而load()将会报出ObjectNotFoundEcception.如果你使用load方法,hibernate认为该id对应的对象(数据库记录)在数据库
中是一定存在的,所以它可以放心的使用,它可以放心的使用代理来延迟加载该对象。在用到对象中的其他属性数据时才查询数据库,但是万一数据库中不存在该记
录,那没办法,只能抛异常,所说的load方法抛异常是指在使用该对象的数据时,数据库中不存在该数据时抛异常,而不是在创建这个对象时。由于
session中的缓存对于hibernate来说是个相当廉价的资源,所以在load时会先查一下session缓存看看该id对应的对象是否存在,不存在则创建代理,实际使用数据时才查询二级缓存和数据库.所以如果你知道该id在数据库中一定有对应记录存在就可以使用load方法来实现延迟加载。
b,load()方法可以返回实体的代理类实例,而get返回的可能是实体类,也可能是代理类.get方法如果在session缓存中找到了该id对应的对象,如果刚好该对象前面是被代理过的,如被load方法使用过,或者被其他关联对象延迟加载
过,那么返回的还是原先的代理对象,而不是实体类对象,如果该代理对象还没有加载实体数据(就是id以外的其他属性数据),那么它会查询二级缓存或者数据
库来加载数据,但是返回的还是代理对象,只不过已经加载了实体数据。
类LockMode定义了6种锁定模式.
(1)LockMode.NONE:默认模式,表示无需锁机制.如果缓存中存在持久化实例,直接使用缓存中的实例.当用session.lock方法的时候,不会执行SQL语句,只有当对被lock的对象作改变,会有update语句.
(2)LockMode.READ:共享锁.载入数据直接从数据库中读取.当用session.lock方法的时候,总会执行SQL Select语句.
(3)LockMode.UPGRADE:使用select……from……for update格式载入数据,并为数据加锁.若数据不支持select……from……for update格式,则使用LockMode.READ模式.
(4)LockMode.UPGRADE_NOWAIT:使用Oracle风格的SQL语句:select……from……for update nowait载入数据.获得锁后,该模式和LockMode.UPGRATE模式的语义相同.
(5)LockMode.WRITE:当Hibernate更新或插入数据时,自动设置LockMode.WRITE模式,该械只能由Hibernate内部使用.
(6)LockMode.FORCE:使用版本控制时,强制实现版本增强,语义和LockMode.UPGRADE相同.
3,如果多表关联在多方的配置文件中指定了property-ref="主表的字段",在做关联查询的时候会执行不必要的SQL语句(在每次取子表数据时,会反向的用SQL再去取主表的数据).
4,多表关联查询用session.createCriteria(XXX.class);可能会包含主表的重复记录,需要用过滤,如下:
criteria.add(Restrictions.eq("mval","mastinfo1")).
setFetchMode("ukdettbs", FetchMode.EAGER); //execute 5 SQL select
List list = criteria.list();
Set set = new HashSet(list);
5,Hibernate 对数据库的操作是更具当前Object处于的状态,从而将Object的值插入或者更新到数据库中.如果在混合使用SQL和HQL,对象值的改变操作时,SQL和HQL对数据的改变不会自动反映到对象上面,如果session在某个SQL或者HQL的update之后,又因为Object的值的改变而执行了另外一个update,SQL或者HQL的update会丢失.如下:
在同一个session中(HQL)的例子,对val的更新会丢失:
tx = sessionFactory.getCurrentSession().beginTransaction();
Hbtest tbo = new Hbtest();
tbo.setId(id);
sessionFactory.getCurrentSession().save(tbo);
sessionFactory.getCurrentSession().createQuery("UPDATE com.test.hb.Hbtest ht SET ht.val=? WHERE ht.id=?")
.setString(0, "val")
.setInteger(1, id).executeUpdate();
tbo.setVal2("val2");//由于val的值并没有反映到tbo对象上,val的值会丢失
tx.commit();
在不同session中(SQL)的例子,对val的更新会丢失:
tx = sessionFactory.getCurrentSession().beginTransaction();
Hbtest tbo = new Hbtest();
tbo.setId(id);
sessionFactory.getCurrentSession().save(tbo);
tx.commit();
tx = sessionFactory.getCurrentSession().beginTransaction();
sessionFactory.getCurrentSession().createSQLQuery("UPDATE HBTEST SET VAL=? WHERE ID=?")
.setString(0, "val")
.setInteger(1, id).executeUpdate();
tx.commit();
tx = sessionFactory.getCurrentSession().beginTransaction();
tbo.setVal2("val2");//由于val的值并没有反映到tbo对象上,val的值会丢失
sessionFactory.getCurrentSession().update(tbo);
tx.commit();
6,Hibernate在做级联删除的时候,如果主表方的inverse为false,会先将子表的外键设为null,然后再删除,如果外键设了not null限制,会有异常发生.如果inverse为true,则不会有将子表的外键设为null的步骤.
在inverse=false的时候,在删除主表对应的Object的时候,如果没有将子表对应的object加到主表对应的object的set里,只会将子表的外键设为null.
如果inverse=true,在删除主表对应的Object的时候,如果没有将子表对应的object加到主表对应的object的set里,只会删除主表,引发数据库异常.
7,cascade的delete 和delete-orphan的区别,在把一个主表对应的记录load或者get到session后,如果将子表的记录从主表对应对象的set里remove掉,delete-orphan会将子表记录delete掉.而cascade设为delete时,如果inverse为false,会将子表的外键设为null,如果inverse设为true,不会对子表进行操作.
8,对native SQL query进行cache的时候遇到的java.lang.ClassCastException: XXXX at org.hibernate.cache.StandardQueryCache.put(StandardQueryCache.java:83) 问题:SQLQuery.addScalar来解决.
Query q1 = session.createSQLQuery("select val from Hbtest h where h.id<3");
q1.setCacheable(true);
((SQLQuery)q1).addScalar("val", Hibernate.STRING);
9,对于一个非active的session进行commit和rollback会有异常,所以在rollback的时候最好进行如下判断:
if (null != tx && tx.isActive()) {
tx.rollback();
}
10,一个表可以对应多个class:
<class name="com.test.hb.Hbtest" table="HBTEST">
<class name="com.test.hb.Hbtest1" table="HBTEST">
11,如果一条数据库的数据被两个线程并发load然后做修改,会出现'丢失更新'.[需要利用LockMode来控制并发访问]
分享到:
相关推荐
然而,使用Hibernate的过程中,开发者需要特别注意一些关键点,以确保应用的稳定性和性能。本文将探讨在使用Hibernate时可能遇到的问题,特别是关于数据源的配置。 首先,我们来理解什么是数据源。数据源是Java中用...
以下是对Hibernate的一些关键知识点的详细说明: 1. **异常处理**: 在描述中提到的`org.hibernate.PropertyValueException: not-null property references a null or transient value`是Hibernate抛出的一个常见...
Hibernate AIP,全称为Hibernate Application ...通过熟练掌握这些知识点,开发者可以高效地在Java项目中整合和利用数据库资源,实现更简洁、可维护的代码。在实践中,不断学习和探索,才能更好地发挥Hibernate的威力。
### 优化Hibernate性能的几点建议 #### 一、调整Fetch Size以提高性能 在使用Hibernate进行数据查询时,Fetch Size的设置对性能有着显著的影响。Fetch Size是指每次从数据库中取出的数据行数,默认情况下,Oracle...
### Struts2、Spring与Hibernate整合的关键点及注意事项 #### 一、概述 在Java Web开发领域,Struts2、Spring以及Hibernate是三个非常重要的框架。它们分别在MVC架构、依赖注入与业务逻辑管理、对象关系映射等方面...
在`hibernate.cfg.xml`文件中,有一些重要的配置项需要注意: - **`validate`**:该选项控制Hibernate是否在启动时验证数据库表结构是否与实体映射文件中的定义相匹配。如果启用了`validate`,并且发现不匹配的情况...
Hibernate3 是一个强大的Java持久化框架,它允许开发者将数据库操作与业务逻辑解耦,使得应用程序的开发更为简便。...但要注意,使用前需阅读并遵守jboss-LICENSE.txt中的许可条款,确保合法合规使用。
然而,值得注意的是,尽管Middlegen简化了开发流程,但其自动生成的代码可能并不完全符合项目的特定需求,因此在实际使用中,往往需要对生成的代码进行适当的调整和优化。 总结来说,Hibernate扩展Middlegen-...
在"基于hibernate的简单留言本"项目中,理解并熟练掌握以上知识点是至关重要的。这个项目为初学者提供了实战经验,让他们更好地理解和运用Hibernate框架。通过此项目,开发者不仅可以熟悉Hibernate的基本操作,还能...
注意,不应使用final修饰类,因为这将影响Hibernate的动态代理机制。 2. 持久对象标识OID Hibernate通过对象标识(OID)来区分不同的持久化对象,它相当于数据库中的主键,使得对象与数据库记录一一对应。 总结:...
Hibernate 5.2.8是该框架的一个稳定版本,修复了一些已知问题,增强了性能,并提供了对最新Java版本的支持。此版本可能包括对之前版本的改进,例如更高效的查询执行、更强大的注解支持以及对JPA 2.1规范的更好实现...
下面将详细介绍与标题、描述及部分代码相关的几个核心知识点: ### Hibernate 连表查询基础 Hibernate 是一个开源的对象关系映射(ORM)框架,它允许开发人员将Java对象模型映射到数据库表,并在对象和数据库之间...
然而,也需要注意到,过度依赖ORM可能导致性能问题,因此在设计大规模应用时,需要合理使用ORM并结合原生SQL进行优化。 总之,这个“Hibernate驱动包”是Java开发中的重要工具,为开发者提供了强大的数据库操作支持...
需要注意的是,这种级别的级联可能会带来一些副作用,如意外地删除关联的数据,因此在实际使用中需要谨慎。 ### 总结 通过上述内容,我们了解了Hibernate中`fetch`, `lazy`, `cascade`, 和 `inverse`的关键概念...
- 使用IDEA内置的JAR包(注意IDEA内置版本可能不是最新)。 - 自动导入JAR包。 对于本项目,推荐使用本地的Hibernate JAR包,这样可以确保使用最新版本的Hibernate。在项目的`lib`目录下,通常包含多个JAR包,但...
11. **最佳实践**:分享了在实际开发中使用Hibernate的一些最佳实践和注意事项,帮助开发者避免常见问题。 这个文档是Hibernate开发者的重要参考资料,无论是初学者还是有经验的开发者,都能从中获取到实用的信息和...
01 01Hibernate_Handwork : 手工配置使用Hibernate,其中详细标了Hibernate进行持久化的一些过程,因为是Hibernate的入门实例,所以注释很详细,其中有session的关闭后重建问题。 02 02Hibernate_UseMyEclipse: 利用...