首页 > 解决方案 > 无法更新 testUpdateBookOrdersShippingAddress 中的任何属性

问题描述

我在更新 BookOrder 时遇到问题。BookOrder 根据多对多关系通过复合键连接到 DetailOrder。

错误如下所示。

May 23, 2019 2:33:48 PM com.mchange.v2.c3p0.impl.NewPooledConnection 
INFO: [c3p0] Exceptions occurred while trying to close a PooledConnection's resources normally.
May 23, 2019 2:33:48 PM com.mchange.v2.c3p0.impl.NewPooledConnection 
INFO: [c3p0] NewPooledConnection close Exception.
java.sql.SQLException: ORA-03106: fatal two-task communication protocol error

    at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:494)
    at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:441)
    at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:436)
    at oracle.jdbc.driver.T4C7Ocommoncall.processError(T4C7Ocommoncall.java:86)
    at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:623)
    at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:252)
    at oracle.jdbc.driver.T4C7Ocommoncall.doOLOGOFF(T4C7Ocommoncall.java:62)
    at oracle.jdbc.driver.T4CConnection.logoff(T4CConnection.java:908)
    at oracle.jdbc.driver.PhysicalConnection.close(PhysicalConnection.java:2005)
    at com.mchange.v2.c3p0.impl.NewPooledConnection.close(NewPooledConnection.java:642)
    at com.mchange.v2.c3p0.impl.NewPooledConnection.closeMaybeCheckedOut(NewPooledConnection.java:255)
    at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.destroyResource(C3P0PooledConnectionPool.java:622)
    at com.mchange.v2.resourcepool.BasicResourcePool$1DestroyResourceTask.run(BasicResourcePool.java:1076)
    at com.mchange.v2.resourcepool.BasicResourcePool.destroyResource(BasicResourcePool.java:1101)
    at com.mchange.v2.resourcepool.BasicResourcePool.destroyResource(BasicResourcePool.java:1062)
    at com.mchange.v2.resourcepool.BasicResourcePool.access$100(BasicResourcePool.java:44)
    at com.mchange.v2.resourcepool.BasicResourcePool$5.run(BasicResourcePool.java:1316)

May 23, 2019 2:33:48 PM com.mchange.v2.resourcepool.BasicResourcePool 
WARNING: Failed to destroy resource: com.mchange.v2.c3p0.impl.NewPooledConnection@3dd18dc6
java.sql.SQLException: Some resources failed to close properly while closing com.mchange.v2.c3p0.impl.NewPooledConnection@3dd18dc6
    at com.mchange.v2.c3p0.impl.NewPooledConnection.close(NewPooledConnection.java:664)
    at com.mchange.v2.c3p0.impl.NewPooledConnection.closeMaybeCheckedOut(NewPooledConnection.java:255)
    at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.destroyResource(C3P0PooledConnectionPool.java:622)
    at com.mchange.v2.resourcepool.BasicResourcePool$1DestroyResourceTask.run(BasicResourcePool.java:1076)
    at com.mchange.v2.resourcepool.BasicResourcePool.destroyResource(BasicResourcePool.java:1101)
    at com.mchange.v2.resourcepool.BasicResourcePool.destroyResource(BasicResourcePool.java:1062)
    at com.mchange.v2.resourcepool.BasicResourcePool.access$100(BasicResourcePool.java:44)
    at com.mchange.v2.resourcepool.BasicResourcePool$5.run(BasicResourcePool.java:1316)

我认为可能存在会话问题。会话可以在需要打开时自动关闭。

我的测试班

@Test
    public void testUpdateBookOrdersShippingAddress() {
        Integer orderId = 48;
        BookOrders bookorders = ordersDAO.get(orderId);

        System.out.println("Update Before (ShippingAddress) : " + bookorders.getShippingAddress());

        bookorders.setShippingAddress("New Home Shipping Address");

        try {
            ordersDAO.update(bookorders);
        } catch (Exception e) {
            e.printStackTrace();
        }


        BookOrders updatedOrder = ordersDAO.get(orderId);

        System.out.println("Update After (ShippingAddress) : " + updatedOrder.getShippingAddress() );

        assertEquals(bookorders.getShippingAddress(), updatedOrder.getShippingAddress());

    }

获取和更新方法的休眠类。

public T update(T t) {

        Session session = sessionFactory.openSession();
        Transaction transaction = null;
        try {
            transaction = session.beginTransaction();

            session.merge(t);
            session.flush();
            session.getTransaction().commit();
            session.close();

        }catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
            transaction.rollback();
        }

        return t; 
    }

    public T get(Class<T> type,Object id) {

        Session session = sessionFactory.openSession();
        Transaction transaction = null;
        T t = null;
        try {
            transaction = session.beginTransaction();

            t = session.get(type, (int)id);
            session.flush();
            session.getTransaction().commit();
            session.close();

        }catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
            transaction.rollback();
        }

        return t; 
    }

标签: oraclehibernateconnection-pooling

解决方案


在基于泛型类型的休眠类的更新函数中,我可以使用session.update(t);而不是session.merge(t); and I could solve it.


推荐阅读