...JDBCException: could not load an entity:
发布网友
发布时间:2024-10-13 12:40
我来回答
共4个回答
热心网友
时间:2024-11-19 11:39
首先这个问题与主键生成方式没有关系,况且楼主可能使用的是Mysql数据库,因此采用identity生成方式完全正确。
其次关于load取数据出现问题是因为取数据的表有级联关系,在我们分析此问题之前,我们先要明白hibernate中什么是load,什么是get,它们两者之间有什么区别呢??
只要你在以往的开发过程中稍加注意,不难发现,假如有两张表,他们为一对多关系,现在开始查询,如果使用get,那么查询的结果将会是把2张表的数据全部持久化到内存中(如果关系比较深你还打算用它吗?),如果是采用load的方式,那么将只会是把其中一张表(A表)的数据加载到内存中,而另一张表(B表)只存在一个标识,原则上是等页面显示时,如果只要显示A表数据,那么程序直接内存中找A表数据,如果还要显示B表数据,那么就要通过内存中B表的标识重新查找数据库,此时,问题出来了,假如你在DAO中,session.load之后你结束了session的生命周期,那么在页面要显示B表数据,而B表在内存中只是一个标识啊,你的session又处于关闭状态,它无法找啊,这就会出现上面你遇到的那个问题,因此,假如我们不关闭session,页面可以正常显示2张表的数据了,但是问题又来了,如果不关闭session,那么对象将一直以持久态的形式保存在内存中,留下的隐患难以想象(比如该对象容易数据混乱等等),千万不要说session.clear之内的东西也可以把对象变游离态之内的话啊,如果你彻底用session.clear取代session.close的话,嘿嘿,自己去尝试吧,当问题显现出来的时候痛苦吧^_^!好了,我还是说下解决方法吧~最好的方法就是将DAO中的session与事物全部抽取出来做成一个hibernate过滤器,这样既能解决你上面的问题,又能大大减少DAO中的代码...好处很多的哦,使用一次之后就容易上瘾-_-我空间里好象有,你可以去看看~稍微修改就可以用!(最好和工具类一起搭配使用,超爽滴!)
热心网友
时间:2024-11-19 11:45
换2005的驱动吧,补充一下,换驱动要修改URL和Driver
http://www.microsoft.com/downloads/details.aspx?familyid=C47053EB-3B64-4794-950D-81E1EC91C1BA&displaylang=zh-cn
JDBC3.0是1个jar,2.0是3个jar
在3.0里面的URL和Driver是这样写的
jdbc:sqlserver://localhost
com.microsoft.sqlserver.jdbc.SQLServerDriver
请注意看,和2.0的区别
jdbc:microsoft:sqlserver://localhost
com.microsoft.jdbc.sqlserver.SQLServerDriver
热心网友
时间:2024-11-19 11:38
<id name="id" type="java.lang.Integer">
<column name="ID" />
<generator class="identity"></generator>
</id>
楼主把identity改为native试试我以前遇到过这种情况,因为identity的id值如果是自动增长的很容易出问题,试试看行不行不行我再看看其它的
————————————————————————————————
楼主可以吗如果不行再试试我下面的,load是读缓存中的数据,could not load an entity,代表缓冲中没有数据,试试把dao中的,load方法(从缓存冲读数据没有则抛出异常)改为get方法(get 每次执行先从缓存中找,都从数据库查数据,没有则返回null)
______________________________________________________
我们在使用Hibernate的lazy load来优化性能的时候,只要Session关闭后再试图访问未被载入的对象时,
就会出现异常。通常使用在事务之内来访问数据是适合的,但是有时候我们需要强制载入这些数据,例
如在Web视图中访问这些模型对象。
在业务层强制载入这些数据,通常不是很好的解决方案,因为不同的视图在使用业务方法的时候,需要的数据
通常不一样,这样业务方法可能绑定到特定的控制器中。
在业务层上面增加一个Facade(也可以用过滤器)层来解决这个问题,同样也会增加一层不太必要的封装,增加了复杂性,POJO in Action一书中的例子就是这么设计的(POJO in Action感觉是本蛮不错的书),详细的可以看看这本书。
通常Open Session in View模式相对来说是个不错的解决方案。事务在服务层结束,但关联的Hibernate Session保持打开状态,直到视图生成完成为止。这样及早的释放了数据库锁和连接,并且视图中可以通过lazy load来加载。
-----------------------------------------------
http://www.javaresearch.org/forum/thread.jsp?thread=60410
不知道楼主是不是这篇文章的问题
热心网友
时间:2024-11-19 11:45
上面问题补充:
全部异常信息为:
Hibernate: select qjsys29x0_.ID as ID30_1_, qjsys29x0_.QJSYS29F as QJSYS2_30_1_, qjsys29x0_.QJSYS29H as QJSYS3_30_1_, qjsys29x0_.QJSYS29C as QJSYS4_30_1_, qjsys29x0_.QJSYS29A as QJSYS5_30_1_, qjsys29x0_.QJSYS29B as QJSYS6_30_1_, qjsys29x0_.QJSYS29D as QJSYS7_30_1_, qjsys29x0_.QJSYS29E as QJSYS8_30_1_, qjsys29x0_.QJSYS29G as QJSYS9_30_1_, qjsys29x0_.QJSYS29I as QJSYS10_30_1_, qjsys30x1_.ID as ID29_0_, qjsys30x1_.QJSYS30A as QJSYS2_29_0_, qjsys30x1_.QJSYS30B as QJSYS3_29_0_, qjsys30x1_.QJSYS30C as QJSYS4_29_0_, qjsys30x1_.QJSYS30D as QJSYS5_29_0_, qjsys30x1_.QJSYS30E as QJSYS6_29_0_, qjsys30x1_.QJSYS30F as QJSYS7_29_0_, qjsys30x1_.QJSYS30G as QJSYS8_29_0_, qjsys30x1_.QJSYS30H as QJSYS9_29_0_ from QJDB.dbo.QJSYS29 qjsys29x0_ left outer join QJDB.dbo.QJSYS30 qjsys30x1_ on qjsys29x0_.ID=qjsys30x1_.ID where qjsys29x0_.ID=?
org.hibernate.exception.GenericJDBCException: could not load an entity: [com.qinjing.hibernate.bean.Qjsys29#3]
at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:103)
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:91)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at org.hibernate.loader.Loader.loadEntity(Loader.java:1799)
at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:47)
at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:41)
at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:2730)
at org.hibernate.event.def.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:365)
at org.hibernate.event.def.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:346)
at org.hibernate.event.def.DefaultLoadEventListener.load(DefaultLoadEventListener.java:123)
at org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:161)
at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:87)
at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:862)
at org.hibernate.impl.SessionImpl.load(SessionImpl.java:781)
at org.hibernate.impl.SessionImpl.load(SessionImpl.java:774)
at com.qinjing.hibernate.business.TestOne2OneBusiness.getQjsys29(TestOne2OneBusiness.java:43)
at com.qinjing.hibernate.business.TestOne2OneBusiness.main(TestOne2OneBusiness.java:92)
Caused by: java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC]ResultSet can not re-read row data for column 2.
at com.microsoft.jdbc.base.BaseExceptions.createException(Unknown Source)
at com.microsoft.jdbc.base.BaseExceptions.getException(Unknown Source)
at com.microsoft.jdbc.base.BaseResultSet.validateColumnIndex(Unknown Source)
at com.microsoft.jdbc.base.BaseResultSet.getInt(Unknown Source)
at com.microsoft.jdbc.base.BaseResultSet.getInt(Unknown Source)
at org.hibernate.type.IntegerType.get(IntegerType.java:28)
at org.hibernate.type.NullableType.nullSafeGet(NullableType.java:113)
at org.hibernate.type.NullableType.nullSafeGet(NullableType.java:102)
at org.hibernate.type.ManyToOneType.hydrate(ManyToOneType.java:95)
at org.hibernate.persister.entity.AbstractEntityPersister.hydrate(AbstractEntityPersister.java:1899)
at org.hibernate.loader.Loader.loadFromResultSet(Loader.java:1372)
at org.hibernate.loader.Loader.instanceNotYetLoaded(Loader.java:1300)
at org.hibernate.loader.Loader.getRow(Loader.java:1197)
at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:569)
at org.hibernate.loader.Loader.doQuery(Loader.java:689)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:224)
at org.hibernate.loader.Loader.loadEntity(Loader.java:1785)
... 13 more