休眠会话成功更新了对象,但偶尔没有

时间:2019-02-22 11:27:57

标签: java hibernate

我通过Hibernate会话在多线程模式下使用PostgreSQL。初始化:

<property name="connection.driver_class">org.postgresql.Driver</property>
<property name="hibernate.current_session_context_class">thread</property> 

(其他字符串是连接URL和实体xml描述)

HibernateUtil:

public class HibernateUtil {
    private static SessionFactory sessionFactory;

    static {
        try {
            Configuration configuration = new Configuration();
            configuration.configure();
            sessionFactory = configuration.buildSessionFactory();
        } catch (Throwable ex) {
            throw new ExceptionInInitializerError(ex);
        }
    }

    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }

    public static Session getSession() {
        return sessionFactory.getCurrentSession();
    }

    public static void close() {
        sessionFactory.close();
    }

    public static void setSessionFactory(SessionFactory factory) {
        sessionFactory = factory;
    }
}

所有带有实体i的CRUD动作都在单独的类中执行,其中每个动作都在一个事务中执行。

public class SessionService {
    public static <T> T get(Class<T> classvar, int id) {
        Session session = HibernateUtil.getSession();
        session.beginTransaction();
        T result = session.get(classvar, id);
        session.getTransaction().commit();
        return result;
    }
    // Some other code
    public static void update(Object obj) {
        Session session = HibernateUtil.getSession();
        session.beginTransaction();
        session.update(obj);
        session.getTransaction().commit();
    }
}

多线程工作没有问题(或者我看不到)。但是,前段时间我看到了一个奇怪的错误。我通过SessionService.get(Entity.class,1)从数据库获得了一条记录。更改此实体的一个字段,并通过SessionService.update(entity)保存它。更新已成功完成,没有任何异常(已批准记录)。但是更改未在数据库中看到。在运行时实体中有此更改,但在db中没有。我等了一段时间(等冲洗),但是什么都没有改变。 试图重复错误-一切都很好,没有找到错误。有一天,我在生产服务器上用200个中的19个对象捕获了此错误,但在另一天中,我没有看到此错误。 最后一个重要时刻:我t catched this bug with other entities (or i don看不到他们)。

可能是什么原因?最好使用实体管理器代替会话?

1 个答案:

答案 0 :(得分:0)

可以请您发布整个hibernate.cfg.xml文件(当然要删除用户名和密码)。 您还100%确定不会收到类似(错误猜测)的错误: 具有相同标识符值的另一个对象已与会话关联?

运行Hibernate时出错,运行查询时,文学文字在控制台中闪烁半秒钟。 前一段时间有这个问题。