zoukankan      html  css  js  c++  java
  • hibernate与struts2整合中出现问题以及一级缓存查询数据在业务层问题

    直接上问题:

      

    org.hibernate.HibernateException: HHH000142: Javassist Enhancement failed: cn.xxx.pojo.Customer
        at org.hibernate.proxy.pojo.javassist.JavassistProxyFactory.getProxy(JavassistProxyFactory.java:130)
        at org.hibernate.tuple.entity.AbstractEntityTuplizer.createProxy(AbstractEntityTuplizer.java:666)
        at org.hibernate.persister.entity.AbstractEntityPersister.createProxy(AbstractEntityPersister.java:4462)
        at org.hibernate.event.internal.DefaultLoadEventListener.createProxyIfNecessary(DefaultLoadEventListener.java:359)
        at org.hibernate.event.internal.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:274)
        at org.hibernate.event.internal.DefaultLoadEventListener.doOnLoad(DefaultLoadEventListener.java:121)
        at org.hibernate.event.internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:89)
        at org.hibernate.internal.SessionImpl.fireLoad(SessionImpl.java:1129)
        at org.hibernate.internal.SessionImpl.access$2600(SessionImpl.java:164)
        at org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.getReference(SessionImpl.java:2669)
        at org.hibernate.internal.SessionImpl.load(SessionImpl.java:965)
        at cn.xxx.dao.impl.CustomerDaoImpl.findOrderByCst(CustomerDaoImpl.java:45)
        at cn.xxx.dao.impl.CustomerDaoImpl.demo1(CustomerDaoImpl.java:52)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
        at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
        at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
        at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
        at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
        at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
        at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
        at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
        at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
        at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
        at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
        at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
        at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
        at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
        at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
        at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
        at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:678)
        at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
        at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
    Caused by: java.lang.NoClassDefFoundError: javassist/util/proxy/Proxy
        at org.hibernate.proxy.pojo.javassist.JavassistProxyFactory.getProxy(JavassistProxyFactory.java:123)
        ... 35 more
    Caused by: java.lang.ClassNotFoundException: javassist.util.proxy.Proxy
        at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        ... 36 more

    一开始报出 HibernateException,这个问题原因是:struts2和hibernate整合时,有些jar包冲突原因,如Javassist.jar,保留高版本吧。解决jar报冲突问题后又给报错误了。

    18:50:37.720 [main] ERROR org.hibernate.proxy.pojo.javassist.JavassistProxyFactory - HHH000142: Javassist Enhancement failed: cn.xxx.pojo.Customer
    java.lang.ClassCastException: cn.xxx.pojo.Customer_$$_javassist_3 cannot be cast to javassist.util.proxy.Proxy
        at org.hibernate.proxy.pojo.javassist.JavassistProxyFactory.getProxy(JavassistProxyFactory.java:123) [hibernate-core-5.0.7.Final.jar:5.0.7.Final]
        at org.hibernate.tuple.entity.AbstractEntityTuplizer.createProxy(AbstractEntityTuplizer.java:666) [hibernate-core-5.0.7.Final.jar:5.0.7.Final]
        at org.hibernate.persister.entity.AbstractEntityPersister.createProxy(AbstractEntityPersister.java:4462) [hibernate-core-5.0.7.Final.jar:5.0.7.Final]
        at org.hibernate.event.internal.DefaultLoadEventListener.createProxyIfNecessary(DefaultLoadEventListener.java:359) [hibernate-core-5.0.7.Final.jar:5.0.7.Final]
        at org.hibernate.event.internal.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:274) [hibernate-core-5.0.7.Final.jar:5.0.7.Final]
        at org.hibernate.event.internal.DefaultLoadEventListener.doOnLoad(DefaultLoadEventListener.java:121) [hibernate-core-5.0.7.Final.jar:5.0.7.Final]
        at org.hibernate.event.internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:89) [hibernate-core-5.0.7.Final.jar:5.0.7.Final]
        at org.hibernate.internal.SessionImpl.fireLoad(SessionImpl.java:1129) [hibernate-core-5.0.7.Final.jar:5.0.7.Final]
        at org.hibernate.internal.SessionImpl.access$2600(SessionImpl.java:164) [hibernate-core-5.0.7.Final.jar:5.0.7.Final]
        at org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.getReference(SessionImpl.java:2669) [hibernate-core-5.0.7.Final.jar:5.0.7.Final]
        at org.hibernate.internal.SessionImpl.load(SessionImpl.java:965) [hibernate-core-5.0.7.Final.jar:5.0.7.Final]
        at cn.xxx.dao.impl.CustomerDaoImpl.findOrderByCst(CustomerDaoImpl.java:45) [classes/:?]
        at cn.xxx.dao.impl.CustomerDaoImpl.demo1(CustomerDaoImpl.java:53) [classes/:?]
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_112]
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_112]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_112]
        at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_112]
        at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) [junit.jar:4.12]
        at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) [junit.jar:4.12]
        at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) [junit.jar:4.12]
        at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) [junit.jar:4.12]
        at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) [junit.jar:4.12]
        at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) [junit.jar:4.12]
        at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) [junit.jar:4.12]
        at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) [junit.jar:4.12]
        at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) [junit.jar:4.12]
        at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) [junit.jar:4.12]
        at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) [junit.jar:4.12]
        at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) [junit.jar:4.12]
        at org.junit.runners.ParentRunner.run(ParentRunner.java:363) [junit.jar:4.12]
        at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86) [.cp/:?]
        at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) [.cp/:?]
        at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459) [.cp/:?]
        at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:678) [.cp/:?]
        at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382) [.cp/:?]
        at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192) [.cp/:?]

    上代码:

    @Override
        public Set<Order> findOrderByCst(Long cstId) {
         //这里面getSession方法直接获取当前线程的session对象 Session session
    = HibernateSessionFactory.getSession(); Set<Order> orders = session.load(Customer.class, cstId).getOrders(); return orders; } @Test public void demo1(){ Session session = HibernateSessionFactory.getSession(); Transaction transaction = session.beginTransaction(); Set<Order> orders = findOrderByCst(1L); for (Order order : orders) { System.out.println(order); } transaction.commit(); }

    我们知道;对于一些比较复杂的业务,事务都放在业务层开启和关闭,我们经常需要保证连接对象的一致,不然可能导致某些逻辑操作成功另一些失败,不符合原子性。这里有一篇文章介绍的很详细,概念和例子:https://blog.csdn.net/weixin_40657079/article/details/82055822。

    那么上面代码就是基于dao层存放操作,service层存放事务。但是现在出现问题,查询一对多的关联对象时候,我用的时load方法,我们知道load是懒加载,他必须在有session的持久态情况才能使用,用的时候才会向数据库发送数据,离开session进入脱管在查询就会报错。

    解决办法:

      1:不用懒加载。

        用get方法或者在配置映射文件配置lazy=false。这里是一对多,一个顾客多个订单,主控方为顾客,关联方为订单,所以在主控方set配置lazy=false(也就是配置关联级别延迟加载)

      2:离线条件查询(QBC检索):

        指的是脱离session进行条件查询,如果什么条件都不设置就是查询全部。

        Web层或者Service层获取DetachedCriteria对象,

    DetachedCriteria dc = DetachedCriteria.forClass(cCustomer.class)

        dao层:

    Criteria criteria = dc.getExecutableCriteria(session);
    criteria.list();

        这样照样可以使用懒加载,降低内存消耗

  • 相关阅读:
    MS SQL数据库在FAT32格式下数据大小不能超过4G
    屏蔽五项功能 让Windows XP极速狂飙
    FastReport安装
    电脑总是死机
    Win XP控制台命令详解
    一个人独自去看海
    my best love lover
    我的第一个blog
    我的学习生涯
    Codeforces Round #323 (Div. 2) C. GCD Table
  • 原文地址:https://www.cnblogs.com/ends-earth/p/10809424.html
Copyright © 2011-2022 走看看