Hibernate 调用方法&x27;createQuery';在没有活动事务的情况下无效

Hibernate 调用方法&x27;createQuery';在没有活动事务的情况下无效,hibernate,dropwizard,Hibernate,Dropwizard,我正在使用DropWizard和Hibernate。我像这样构建我的会话工厂: Configuration configuration = new Configuration(); configuration.setProperty(AvailableSettings.DRIVER, "org.h2.Driver"); configuration.setProperty(AvailableSettings.USER, "

我正在使用DropWizard和Hibernate。我像这样构建我的
会话工厂

        Configuration configuration = new Configuration();
        configuration.setProperty(AvailableSettings.DRIVER, "org.h2.Driver");
        configuration.setProperty(AvailableSettings.USER, "");
        configuration.setProperty(AvailableSettings.PASS, "");
        configuration.setProperty(AvailableSettings.URL, "jdbc:h2:file:./var/test");
        configuration.setProperty(AvailableSettings.DIALECT, "org.hibernate.dialect.H2Dialect");
        configuration.setProperty(AvailableSettings.CURRENT_SESSION_CONTEXT_CLASS, "thread");
        return configuration.buildSessionFactory();
(看看你是否想知道为什么。)

第一个
createQuery
调用成功,第二个调用失败(标题中有错误):


这两个课程应该是不同的吗?还是这是我如何设置的产物?我希望第二个版本能够工作的原因是,它实际上是从一个只有工厂句柄的不同类调用的。我应该传递会话吗?

在相应的资源方法中是否使用
@UnitOfWork
注释?你能分享更多的代码吗,比如,你在哪里打开会话,你的资源方法是什么样子的等等?@philonous抱歉,我应该指出这是DAO的JUnit测试(根据我链接的问题)。你不需要像你那样设置会话工厂。请参阅文档中关于Hibernate的部分:–您正在使用Dropwizard 2吗?@philonous谢谢!不知怎的,我错过了那个部分。但即使使用了这种技术,我也有同样的问题。唯一改变的是错误消息:“javax.persistence.TransactionRequiredException:执行更新/删除查询”(同样,只有
getCurrentSession
版本会导致这种情况)。我想正确的方法是使用
database.inTransaction
模式。我会看看我能不能让它为我工作。如果上述模式也能奏效,那就太好了!您是否在相应的资源方法中使用
@UnitOfWork
注释?你能分享更多的代码吗,比如,你在哪里打开会话,你的资源方法是什么样子的等等?@philonous抱歉,我应该指出这是DAO的JUnit测试(根据我链接的问题)。你不需要像你那样设置会话工厂。请参阅文档中关于Hibernate的部分:–您正在使用Dropwizard 2吗?@philonous谢谢!不知怎的,我错过了那个部分。但即使使用了这种技术,我也有同样的问题。唯一改变的是错误消息:“javax.persistence.TransactionRequiredException:执行更新/删除查询”(同样,只有
getCurrentSession
版本会导致这种情况)。我想正确的方法是使用
database.inTransaction
模式。我会看看我能不能让它为我工作。如果上述模式也能奏效,那就太好了!
        try (Session session = sessionFactory.openSession()) {
            Transaction transaction = session.beginTransaction();
            session.createQuery(...).executeUpdate();
            sessionFactory.getCurrentSession().createQuery(...).executeUpdate();
            transaction.commit();
        }