`
- 浏览:
472843 次
- 性别:
- 来自:
上海转北京
-
表中有数据却报org.hibernate.ObjectNotFoundException:No row with the given identifier ex
今天中午做的添加商品时,先列出种类,颜色,材质等基本信息都没有错,可晚上继续战斗时却很郁闷,一上来就报
org.hibernate.ObjectNotFoundException:No row with the given identifier ex
找来找去,就是第30行,列出种类时报错,但是商品种类表中是有数据的。
这里面的关系其实也不复杂,就是
ViGoods ViGoodsDetail 是一对一关系,商品与商品详情
ViGoods ViGoodsKind 是多对一关系 ,商品与商品种类
问题看似是种类表的数据有问题,其实是因为Vigoods表中的kind_id,有的在种类表中不存在,原因是在程序中,添加时,可能种类没有加进去,默认为0,但是种类中没有0的值,这样就错了。
在网上找了找,发现也有网友出现类似的问题,他写的比较详细,转一下:
作者:blurxx 日期:2008-01-17
产生此问题的原因:
有两张表,table1和table2.产生此问题的原因就是table1里做了关联<one-to-one>或者<many-to-one unique="true">(特殊的多对一映射,实际就是一对一)来关联table2.当hibernate查找的时候,table2里的数据没有与table1相匹配的,这样就会报No row with the given identifier exists这个错.(一句话,就是数据的问题!)
假如说,table1里有自身的主键id1,还有table2的主键id2,这两个字段.
如果hibenrate设置的单项关联,即使table1中的id2为null值,table2中id2中有值,查询都不会出错.但是如果table1中的id2字段有值,但是这个值在table2中主键值里并没有,就会报上面的错!
如果hibernate是双向关联,那么table1中的id2为null值,但是table2中如果有值,就会报这个错.这种情况目前的解决办法就是改成单项关联,或者把不对应的数据改对!
这就是报这个错的原因了,知道原因了就相应的改就行了.或许还有些人迷惑hibernate关联都配好了,怎么会出现这样的错?其实这是编程的时候出现的问题,假如说我在添加信息的时候,页面传过来的struts的formbean到dao方法中需要封装成hibernate的po(就是hibenrate的bean),要是一个个po.get(form.set())实在太麻烦了,这样一般都会写个专门的方法来封装,遇到po.get(form.set())这种情况直接把struts的formbean对象传到此方法中封装就行了,假如我有个字段是创建人id,那么这个字段是永远不会改的,我在添加的时候还调用这个方法,这个专门封装的方法是有一些判断的,假如说我判断一下,如果遇到创建人id传过来为空值,我判断如果是空值,我把创建人id设为0,但是用户表中userid是主键从1开始自增的,那么这样数据就对应不上了,一查就会出这个错了.这个错在开发刚开始的时候经常发生,因为每个人的模块都是由相应的人独立开发完成以后再整合在一起的,每个人写单独那一块的时候往往会忽略这些,所以整合的时候这些问题往往就都一下子全冒出来了....整合很辛苦,tnnd!
hibernate的查询的比较
hibernate的查询有很多,Query,find,Criteria,get,load
query使用hsql语句,可以设置参数是常用的一种方式
criteria的方式,尽量避免了写hql语句,看起来更面向对象了。
find方式,这种方式已经被新的hibernate丢弃
get和load方式是根据id取得一个记录
下边详细说一下get和load的不同,因为有些时候为了对比也会把find加进来。
1,从返回结果上对比:
load方式检索不到的话会抛出org.hibernate.ObjectNotFoundException异常
get方法检索不到的话会返回null
2,从检索执行机制上对比:
get方法和find方法都是直接从数据库中检索
而load方法的执行则比较复杂
1,首先查找session的persistent Context中是否有缓存,如果有则直接返回
2,如果没有则判断是否是lazy,如果不是直接访问数据库检索,查到记录返回,查不到抛出异常
3,如果是lazy则需要建立代理对象,对象的initialized属性为false,target属性为null
4, 在访问获得的代理对象的属性时,检索数据库,如果找到记录则把该记录的对象复制到代理对象的target
上,并将initialized=true,如果找不到就抛出异常
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
hibernate 是一个强大的对象关系映射(ORM)框架,它的核心功能在于将Java对象的数据映射到关系数据库中,使得开发人员能够以面向对象的方式来处理数据库操作,而无需过多关注底层的SQL语句。这种映射机制极大地简化...
Hibernate是一个开源的对象关系映射(ORM)框架,它能够将Java对象映射到数据库表中,并管理这些对象的生命周期。使用Hibernate可以大大减少开发过程中与数据库交互所需的代码量,提高开发效率。 1. **初始化:** ...
Hibernate是一款流行的Java ORM(对象关系映射)框架,它允许开发者将数据库操作抽象化,以对象的方式进行处理,简化了数据库编程。以下是对`Hibernate配置[归类].pdf`文件中涉及的几个主要知识点的详细解释: ### ...
在后续使用该对象的属性时,会抛出`org.hibernate.ObjectNotFoundException`异常。此外,`load()`支持懒加载,即只有在真正需要使用对象时才会触发数据库查询。 - **`get()`**:此方法也用于加载对象。但如果数据库...
- 如果数据库中不存在该对象,则会抛出`org.hibernate.LazyInitializationException`或`org.hibernate.ObjectNotFoundException`异常。 - 使用`load()`可以提高性能,因为它减少了不必要的数据库访问。 2. **Get...
在本课程中,我们将深入探讨如何使用Hibernate框架来开发一个租房系统。Hibernate是一个强大的Java对象关系映射(ORM)框架,它简化了数据库操作,使开发者可以更专注于业务逻辑而不是数据库层面的细节。第12章的...
- **缓存的同步更新**: 当 Session 清理缓存时,Hibernate 会检查缓存中的对象状态是否发生变化,并同步更新数据库,从而确保数据一致性。 - **缓存相关方法**: - **`flush()`**: 刷新缓存并执行必要的 SQL 语句,...
1. 开始项目:了解如何在实际项目中引入Hibernate和NHibernate,设置数据库连接,并实现第一个简单的数据操作。 2. 进阶应用:学习如何处理复杂的一对多、多对一、多对多关系,以及如何进行事务管理和并发控制。 3. ...
2. **异常处理:**如果使用`load()`方法加载的对象不存在于数据库中,Hibernate会抛出`ObjectNotFoundException`异常;而`get()`方法则直接返回`null`。 3. **懒加载支持:**`load()`方法默认支持懒加载,即只有在...
2. `hibernate.cfg.xml`中的`<mapping resource="com/xx/User.hbm.xml"/>`定义了对象-关系映射,用于将Java对象映射到数据库表。 3. 使用配置信息构建`SessionFactory`,它是Hibernate的核心,负责生成Session对象。...
//该方法会延迟加载/获取数据(只有使用该对象中的字段时才会向数据库发出查询语句),该方法会在内部和二级缓存中查找数据,当数据库中没有要查询的数据时报ObjectNotFoundException异常 (7).createQuery(String HQL)...
ORM:使用元数据信息来描述对象和数据库之间的关系,并且能够自动实现java中持久化对象到关系型数据库中表的映射 脏检查:自动对缓存中的数据进行检查,并且选择在合适的时机和数据库之间进行交互,以保持数据的...
如果找不到对应的记录,将会抛出 `org.hibernate.ObjectNotFoundException` 异常。 - `load(Class<T> theClass, Serializable id)`:根据类类型和主键加载对象。 - `load(Class<T> theClass, Serializable id, ...
当使用Hibernate的`Session.load()`方法或在映射文件中设置了`lazy="true"`时,Hibernate并不会立即从数据库中获取关联对象的所有数据,而是创建一个代理对象。这个代理对象在需要访问其属性时才会执行实际的数据库...
Hibernate 是一个流行的开源对象关系映射(ORM)框架,它为 Java 程序员提供了一种方便的方式来操作数据库,通过将 Java 类与数据库表进行映射,使得程序员可以用面向对象的方式来处理数据。ORM 技术消除了传统 JDBC...
- Hibernate提供了丰富的异常体系,如ConstraintViolationException(约束违反)、ObjectNotFoundException(对象未找到)等,有助于调试和错误处理。 ### 8. 性能优化 - 使用批处理更新和查询,减少数据库交互...
如果数据库中不存在该对象,load()会抛出`org.hibernate.ObjectNotFoundException`异常。load()支持延迟加载,允许对象在需要时才加载。 2. list()与iterator()方法: - list()方法:在执行时,list()一次性获取...
【Hibernate 框架面试详解】 1. **Hibernate 查询数据的方式** - 导航对象图查询:通过对象之间的关联关系直接获取数据。 - OID 查询:基于对象标识符(Object Identifier)查找对象。 - HQL(Hibernate Query ...
- `load()`返回的是一个代理对象,假设数据存在于数据库中,如果实际不存在,会在使用数据时抛出`ObjectNotFoundException`。它只检查一级缓存,若未找到,则创建代理对象。 - `get()`则会立即从一级缓存、二级...
实体类代表数据库中的表,类属性对应表的字段,对象实例则代表表中的行。Hibernate自动处理对象的持久化、检索、更新和删除。 ### 5. Session操作 - **保存(Save)**: 使用`session.save()`或`session.persist()`...