【问题标题】:"java.lang.NoSuchFieldError: NONE" in hibernate with Spring 3, maven, JPA, c3p0“java.lang.NoSuchFieldError: NONE”在休眠中使用 Spring 3、maven、JPA、c3p0
【发布时间】:2011-08-09 07:21:09
【问题描述】:

问题:

Hibernate 未正确执行查询。它出现了一个似乎与 slf4j 相关的问题,但使用任何推荐的修复方法似乎都不起作用。

我为 createQuery 调用尝试了各种变量名组合,希望我做错了(TM) 但到目前为止还没有运气。这个问题真让我难过,有没有人遇到过类似的情况?

堆栈跟踪:

Exception in thread "main" java.lang.NoSuchFieldError: NONE
    at org.hibernate.ejb.QueryImpl.<init>(QueryImpl.java:604)
    at org.hibernate.ejb.QueryImpl.<init>(QueryImpl.java:79)
    at org.hibernate.ejb.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:268)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:341)
    at $Proxy12.createQuery(Unknown Source)
    at com.package.mvcfromscratch.dao.PostgresEventDao.numberOfEvents(PostgresEventDao.java:17)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:309)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:196)
    at $Proxy11.numberOfEvents(Unknown Source)
    at com.package.mvcfromscratch.main.UserInterface.main(UserInterface.java:27)

Maven 依赖树:

[INFO] com.package:mvcFromScratch:jar:0.0.1-SNAPSHOT
[INFO] +- org.springframework:spring-context:jar:3.0.3.RELEASE:compile
[INFO] |  +- org.springframework:spring-expression:jar:3.0.3.RELEASE:compile
[INFO] |  \- org.springframework:spring-asm:jar:3.0.3.RELEASE:compile
[INFO] +- org.springframework:spring-beans:jar:3.0.3.RELEASE:compile
[INFO] +- org.springframework:spring-aop:jar:3.0.3.RELEASE:compile
[INFO] |  \- aopalliance:aopalliance:jar:1.0:compile
[INFO] +- org.springframework:spring-web:jar:3.0.3.RELEASE:compile
[INFO] +- org.springframework:spring-core:jar:3.0.3.RELEASE:compile
[INFO] |  \- commons-logging:commons-logging:jar:1.1.1:compile
[INFO] +- org.springframework:spring-test:jar:3.0.3.RELEASE:compile
[INFO] +- org.springframework:spring-jpa:jar:2.0.8:compile
[INFO] |  +- org.springframework:spring-dao:jar:2.0.8:compile
[INFO] |  \- org.springframework:spring-jdbc:jar:2.0.8:compile
[INFO] +- org.springframework:spring-tx:jar:3.0.3.RELEASE:compile
[INFO] +- org.hibernate:hibernate:jar:3.5.3-Final:compile
[INFO] |  \- org.slf4j:slf4j-api:jar:1.5.8:compile
[INFO] +- org.hibernate:hibernate-core:jar:3.5.3-Final:compile
[INFO] |  +- antlr:antlr:jar:2.7.6:compile
[INFO] |  +- commons-collections:commons-collections:jar:3.1:compile
[INFO] |  +- dom4j:dom4j:jar:1.6.1:compile
[INFO] |  |  \- xml-apis:xml-apis:jar:1.0.b2:compile
[INFO] |  \- javax.transaction:jta:jar:1.1:compile
[INFO] +- org.hibernate:hibernate-annotations:jar:3.5.3-Final:compile
[INFO] +- org.hibernate:hibernate-commons-annotations:jar:3.3.0.ga:compile
[INFO] |  \- javax.persistence:persistence-api:jar:1.0:compile
[INFO] +- org.hibernate.javax.persistence:hibernate-jpa-2.0-api:jar:1.0.0.Final:compile
[INFO] +- org.hibernate:hibernate-entitymanager:jar:3.5.3-Final:compile
[INFO] |  +- cglib:cglib:jar:2.2:compile
[INFO] |  |  \- asm:asm:jar:3.1:compile
[INFO] |  \- javassist:javassist:jar:3.9.0.GA:compile
[INFO] +- postgresql:postgresql:jar:8.4-702.jdbc4:compile
[INFO] \- org.slf4j:slf4j-simple:jar:1.5.8:compile

PostgreSql 数据库:

diarmaid=# \d Event;
                                       Table "public.event"
    Column     |          Type          |                        Modifiers                        
---------------+------------------------+---------------------------------------------------------
 eventid       | integer                | not null default nextval('event_eventid_seq'::regclass)
 eventname     | character varying(255) | 
 eventdate     | character varying(255) | 
 eventcapacity | bigint                 | 
Indexes:
    "event_pkey" PRIMARY KEY, btree (eventid)

用户界面类:

public class UserInterface {

    /**
     * @param args
     */
    public static void main(String[] args) {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationcontext.xml");
        EventDao eventDao = applicationContext.getBean("eventDao", EventDao.class);

        // Are there any events?
        System.out.println("Events: " + eventDao.numberOfEvents());
        // Get all events
        List<Event> listEvents = eventDao.getAllEvents();
        // & Print them all out.
        for(Event event : listEvents) {
            System.out.println(event);
        }
        System.out.println(eventDao.getEvent(2));
    }

}

PostgresEventDao 类:

public class PostgresEventDao extends JpaDaoSupport implements EventDao {

    @Override
    public String numberOfEvents() {
        return (String) getJpaTemplate()
            .getEntityManagerFactory()
            .createEntityManager()
            .createQuery("select count(ev.id) from Event ev")
            .getSingleResult();
    }

    @Override
    public List<Event> getAllEvents() {
        return getJpaTemplate().find("from Event");
    }

    @Override
    public Event getEvent(long id) {
        return (Event) getJpaTemplate()
            .getEntityManagerFactory()
            .createEntityManager()
            .createQuery("select d from Event d where d.id = " + id)
            .getSingleResult();
    }

    @Override
    @Transactional
    public void setAllEvents(List<Event> listEvent) {
        for(Event event : listEvent) {
            getJpaTemplate().persist(event);
        }

    }

}

persistence.xml:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0"
    xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">

    <persistence-unit name="Events">
        <class>com.package.mvcfromscratch.entities.Event</class>
        <properties>
            <property name="hibernate.show_sql" value="true" />
            <property name="hibernate.format_sql" value="true" />
            <property name="hibernate.connection.driver_class"
                value="org.postgresql.Driver" />
            <property name="hibernate.connection.url"
                value="jdbc:postgresql://localhost/diarmaid" />
            <property name="hibernate.connection.username"
                value="diarmaid" />
            <property name="hibernate.connection.password"
                value="sqlol" />

            <property name="hibernate.c3p0.min_size" value="5" />
            <property name="hibernate.c3p0.max_size" value="20" />
            <property name="hibernate.c3p0.timeout" value="300" />
            <property name="hibernate.c3p0.max_statements" value="50" />
            <property name="hibernate.c3p0.idle_test_period" value="3000" />
        </properties>
    </persistence-unit>

</persistence>

最后,applicationcontext.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/tx 
        http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">

    <bean id="eventDao" class="com.package.mvcfromscratch.dao.PostgresEventDao"
        autowire="byType">
        <property name="jpaTemplate" ref="jpaTemplate" />
    </bean>

    <bean id="entityManagerFactory"
        class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
        <property name="persistenceUnitName" value="Events" />
    </bean>

    <bean id="jpaTemplate" class="org.springframework.orm.jpa.JpaTemplate">
        <property name="entityManagerFactory" ref="entityManagerFactory" />
    </bean>

    <tx:annotation-driven transaction-manager="myTransactionManager" />

    <bean id="myTransactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory" />
    </bean>
</beans>

【问题讨论】:

  • 另外,我在 Eclipse 中将其作为 Run->As Java Application 运行。

标签: java hibernate spring postgresql maven-2


【解决方案1】:

您包含了旧版本的 hibernate-commons-annotations,它传递地包含了 JPA 1.0,它与 Hibernate 3.5 所需的 JPA 2.0 冲突。

此外,从 Hibernate 3.5 开始,您不再需要包含多个 Hibernate 工件。您只需要在pom.xml 中声明hibernate-entitymanager 就足够了。

另请参阅:

【讨论】:

  • 谢谢 - 马上解决了。我删除了实体管理器的休眠栏的所有依赖项,它运行了。现在不同的错误消息,但完全不相关 - 只是我的错误编码;)
【解决方案2】:

它在org.hibernate.ejb.QueryImpl 中抱怨此代码行:

private javax.persistence.LockModeType jpaLockMode
   = javax.persistence.LockModeType.NONE;

由于javax.persistence.LockModeType.NONE 在 JPA2 中是新的,我怀疑您的类路径中的某个地方也有 JPA1。找到并删除它。

【讨论】:

  • 正如 axtavt 所建议的,我包含了一个旧版本的 hibernate-commons-annotations。这确实包括我的问题的 JPA1。感谢您的输入 =)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-26
  • 2011-03-14
  • 1970-01-01
  • 2012-07-30
  • 2020-11-13
  • 1970-01-01
  • 2016-05-13
相关资源
最近更新 更多