【问题标题】:hibernate dependency issue for spring 4 after upgrading to hibernate 5升级到休眠 5 后 Spring 4 的休眠依赖问题
【发布时间】:2017-08-03 03:17:49
【问题描述】:

下面是我的pom:

<dependencies>
    <dependency>
        <groupId>io.jsonwebtoken</groupId>
        <artifactId>jjwt</artifactId>
        <version>0.6.0</version>
    </dependency>
    <dependency>
        <groupId>com.github.dvdme</groupId>
        <artifactId>ForecastIOLib</artifactId>
        <version>1.5.1</version>
    </dependency>
    <dependency>
        <groupId>com.wewherego</groupId>
        <artifactId>api-core</artifactId>
        <version>1.4.1</version>
    </dependency>
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-io</artifactId>
        <version>1.3.2</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-validator</artifactId>
        <version>5.3.0.Final</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-annotations</artifactId>
        <version>3.3.1.GA</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>5.2.3.Final</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-c3p0</artifactId>
        <version>5.1.0.Final</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.32</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>4.3.2.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aop</artifactId>
        <version>4.3.2.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>4.3.2.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
        <version>4.3.2.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>4.3.2.RELEASE</version>
        <exclusions>
            <exclusion>
                <groupId>commons-logging</groupId>
                <artifactId>commons-logging</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>jcl-over-slf4j</artifactId>
        <version>1.7.12</version>
    </dependency>
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.1.3</version>
    </dependency>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.1.0</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.8.7</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>2.8.7</version>
    </dependency>
    <dependency>
        <groupId>javassist</groupId>
        <artifactId>javassist</artifactId>
        <version>3.12.1.GA</version>
    </dependency>
    <dependency>
        <groupId>com.oracle</groupId>
        <artifactId>ojdbc6</artifactId>
        <version>10.2.0.4.0</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.11</version>
    </dependency>
    <dependency>
        <groupId>com.googlecode.lambdaj</groupId>
        <artifactId>lambdaj</artifactId>
        <version>2.3.3</version>
    </dependency>
    <dependency>
        <groupId>com.google.code.gson</groupId>
        <artifactId>gson</artifactId>
        <version>2.3</version>
    </dependency>
    <dependency>
        <groupId>org.jsoup</groupId>
        <artifactId>jsoup</artifactId>
        <version>1.7.2</version>
    </dependency>
    <dependency>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>exec-maven-plugin</artifactId>
        <version>1.4.0</version>
    </dependency>
    <dependency>
        <groupId>com.amazonaws</groupId>
        <artifactId>aws-java-sdk-s3</artifactId>
        <version>1.11.98</version>
    </dependency>
    <dependency>
        <groupId>org.powermock</groupId>
        <artifactId>powermock-api-mockito</artifactId>
        <version>1.6.4</version>
    </dependency>
    <dependency>
        <groupId>org.powermock</groupId>
        <artifactId>powermock-api-easymock</artifactId>
        <version>1.6.4</version>
    </dependency>
    <dependency>
        <groupId>org.powermock</groupId>
        <artifactId>powermock-module-junit4</artifactId>
        <version>1.6.4</version>
    </dependency>
    <dependency>
        <groupId>org.easymock</groupId>
        <artifactId>easymock</artifactId>
        <version>3.4</version>
        <scope>test</scope>
    </dependency>
</dependencies>

休眠配置是通过注解设置的:

公共类 HibnerateConfiguration {

//declarations that are ignored

public static AnnotationConfiguration config() throws IOException {
    AnnotationConfiguration hibernateConfig = new AnnotationConfiguration();
    hibernateConfig.setProperty(HIBERNATE_DIALECT_STRING, HIBERNATE_DIALECT_MYSQL_VALUE);
    hibernateConfig.setProperty(HIBERNATE_DRIVER_CLASS_STRING, HIBERNATE_DRIVER_CLASS_MYSQL_VALUE);
    String jdbcString = "jdbc:"
            + getHost()
            + ":"
            + .getPort()
            + "/"
            + getDBName()
            + "?autoReconnect=true";
    hibernateConfig.setProperty(HIBERNATE_DB_URL_STRING, jdbcString);
    hibernateConfig.setProperty(HIBERNATE_DB_USERNAME_STRING, getUser());
    hibernateConfig.setProperty(HIBERNATE_DRIVER_PW_STRING, getPassword());
    hibernateConfig.setProperty(HIBERNATE_SESSION_CONTEXT_CLASS_STRING, HIBERNATE_SESSION_CONTEXT_CLASS_VALUE);
    hibernateConfig.setProperty(HIBERNATE_TIMEOUT_STRING, HIBERNATE_TIMEOUT_VALUE);
    hibernateConfig.addAnnotatedClass(myClass.class);
    return hibernateConfig;
}

}

在处理会话时,我有:

包 com.wewherego.api.malloc.infrastructure;

public class SessionHandler {
    private static SessionFactory sessions= null;
    static {
        try {
            if (sessions== null) {
                synchronized (SessionFactory.class) {
                    sessions= HibnerateConfiguration.config().buildSessionFactory();
                }
            }
        }
        catch(Throwable t) {
            throw new ExceptionInInitializerError(t);
        }
    }

    /*
     * Returns a session anyway. If currently no session exist, open a new one;
     * If there is a current session, use the existing one.
     * ***NOTE: potential issue in this method when dealing with session like this***
     */
    @Override
    public Session getSession() {
        try {
            return sessions.getCurrentSession();
        }
        catch (HibernateException he) {
            return sessions.getCurrentSession();
        }
    }

    public void close() {
        sessions.close();
    }
}

它被用作:

session.createQuery(String.format("FROM %s", "myTable"));

会抛出这个异常:

Caused by: java.lang.NoSuchMethodError: org.hibernate.Session.createQuery(Ljava/lang/String;)Lorg/hibernate/query/Query;

在运行时,依赖项是:

hibernate 文档在 Session 类中还有 createQuery:https://docs.jboss.org/hibernate/orm/3.5/api/org/hibernate/Session.html#createQuery(java.lang.String)

但确定我错过了什么?

【问题讨论】:

  • 对于初学者来说,停止混合休眠版本......如果你想要麻烦的话,你正在混合 3.2.6、5.1.0 和 5.2.3。
  • 我在使用 Hibernate java 配置方法编写一些示例项目时遇到了同样的问题。我不得不承认,这个问题不会在 5.2.x(更好的 2.0)下的休眠版本中持续存在,所以我建议你降级一些依赖项以使其正常工作。 @PRATHAP S 在某些时候也是正确的
  • @M.Deinum 感谢您的建议 - hibernate 的 3.2.6 来自 hibernate-annotation,其最新版本仅为 3.x - 是否可以替代它?
  • @Reborn 不是降级某些依赖项,而是一种更新代码使其正常工作的方法吗?
  • 你不需要休眠注释,因为它现在已经集成,只需删除该依赖项。

标签: java spring hibernate maven


【解决方案1】:

您的类路径中有两个版本的 hibernate:3.2.6 和 5.2。移除 3.2.6 版本

此问题部分是由于 hibernate 项目在 3.2 和 3.3 版本之间更改了其 maven 工件名称,导致 maven 版本冲突处理无效。

要查看项目中的 3.2.6 版本是什么,请使用以下命令:

mvn dependency:tree

您将获得依赖关系树。找到拉hibernate.jar的东西,然后用&lt;excludes&gt;标签排除依赖。

快速查看您的依赖列表,不需要此依赖,因为注释直接包含在 hibernate-core.jar(或 hibernate-core 提取的依赖之一)中:

<dependency>
     <groupId>org.hibernate</groupId>
     <artifactId>hibernate-annotations</artifactId>
     <version>3.3.1.GA</version>
</dependency>

它是pulling hibernate 3.2.6.ga。删除它,然后重试,它可能是唯一拉动休眠 3.2.6 的。

【讨论】:

  • 感谢您的信息。我已更新问题以包括我的休眠配置。删除 hibernate-annotations 后,它在我的 HibernateConfuguration 类中出现编译错误:AnnotationConfiguration 无法解析为类型。
  • oh mvn,发现 AnnotationConfiguration 已弃用,现在我正在使用 hibernate.cfg.Configuration。现在可以了!谢谢!
【解决方案2】:

您的配置中可能缺少以下任何一项

  1. Session session = HibnerateConfiguration.config().buildSessionFactory(); 这将返回 SessionFactory 而不是 Session

  2. Hibernate 5 你需要两个 jar:hibernate-core 和 hibernate-entitymanager,我觉得 hibernate-entitymanager 不见了

  3. hibernate.cfg.xml 或任何形式的 applicationContext 应位于应用程序类路径的根目录中

需要查看应用的配置文件和类路径

【讨论】:

  • 1 - 感谢您的收获。我已经更新了问题;是复制/粘贴错误。 2 - hibernate-entitymanager 在 hibernate 5 中已被弃用,你只需要 hibernate-core:mvnrepository.com/artifact/org.hibernate/… 3 - 我正在使用 AnnotationConfiguration 它适用于其他查询方式,例如criteria.list(),只是不是这个所以我不要认为它与休眠的配置有关。
  • // A SessionFactory is set up once for an application! final StandardServiceRegistry registry = new StandardServiceRegistryBuilder() .configure() // configures settings from hibernate.cfg.xml .build(); try { sessionFactory = new MetadataSources( registry ).buildMetadata().buildSessionFactory(); }可以尝试用这种方式创建会话工厂
  • 您是否从c:\Users\username\.m2\repository 中删除了所有旧依赖项,或者您是否运行了maven force update
  • 感谢您的跟进 - 我已更新我的问题以包含有关 SessionFactory 和休眠配置的更多信息。我尝试从 .m2 中删除所有依赖项,但这没有帮助。
  • 从 repo 中删除它们将无济于事,只要它们在 pom 中它们会重新出现。
猜你喜欢
  • 2021-05-05
  • 2020-09-22
  • 2016-11-27
  • 2020-01-05
  • 1970-01-01
  • 1970-01-01
  • 2016-11-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多