【问题标题】:javax.persistence.PersistenceException in Hibernate休眠中的 javax.persistence.PersistenceException
【发布时间】:2013-07-29 08:45:13
【问题描述】:

我已经从数据库中生成了 POJO 和相应的 hbm.xml 映射文件。我想测试这是否正常工作,所以我创建了一个简单的 HelloWorld,它读取一个表中的所有数据并打印它。当我尝试运行它时,会抛出 PersistenceException。这是我的 StackTrace:

javax.persistence.PersistenceException: [PersistenceUnit: helloworld] Unable to build EntityManagerFactory
    at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:924)
    at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:899)
    at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:59)
    at javax.persistence.Persistence.createEntityManagerFactory(Unknown Source)
    at javax.persistence.Persistence.createEntityManagerFactory(Unknown Source)
    at de.planet.hibernateHelloWorld.HelloWorld.service(HelloWorld.java:51)
    at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1539)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:281)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595)
    at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:98)
    at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:91)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:162)
    at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:330)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231)
    at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:174)
    at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:828)
    at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:725)
    at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1019)
    at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:225)
    at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
    at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
    at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
    at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
    at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
    at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
    at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
    at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
    at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
    at java.lang.Thread.run(Thread.java:662)
Caused by: org.hibernate.AnnotationException: Use of the same entity name twice: NnsNetzdaten
    at org.hibernate.cfg.annotations.EntityBinder.bindEntity(EntityBinder.java:403)
    at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:585)
    at org.hibernate.cfg.Configuration$MetadataSourceQueue.processAnnotatedClassesQueue(Configuration.java:3512)
    at org.hibernate.cfg.Configuration$MetadataSourceQueue.processMetadata(Configuration.java:3466)
    at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1355)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1756)
    at org.hibernate.ejb.EntityManagerFactoryImpl.<init>(EntityManagerFactoryImpl.java:96)
    at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:914)
    ... 30 more
Caused by: org.hibernate.DuplicateMappingException: duplicate import: NnsNetzdaten refers to both de.planet.hibernateHelloWorld.data.NnsNetzdaten and NnsNetzdaten (try using auto-import="false")
    at org.hibernate.cfg.Configuration$MappingsImpl.addImport(Configuration.java:2646)
    at org.hibernate.cfg.annotations.EntityBinder.bindEntity(EntityBinder.java:396)
    ... 37 more

我直接从 Eclipse Kepler 将应用程序部署到 Glassfish 3 服务器。但是,当我使用 Maven 打包和部署应用程序时,也会出现此问题。

这是我的 persistence.xml:

<?xml version="1.0" encoding="UTF-8"?>
<persistence 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_1_0.xsd"
    version="1.0">
    <persistence-unit name="helloworld">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <properties>
            <property name="hibernate.archive.autodetection"
                value="class, hbm" />
            <property name="hibernate.connection.driver_class"
                value="oracle.jdbc.driver.OracleDriver" />
            <property name="hibernate.connection.password"
                value="**********" />
            <property name="hibernate.connection.url"
                value="jdbc:oracle:thin:@d11503oracle1.planet-ic.de:1521:XE" />
            <property name="hibernate.connection.username"
                value="WEMAG_ENET_DEV" />
            <property name="hibernate.default_schema" value="WEMAG_ENET_DEV" />
            <property name="hibernate.dialect"
                value="org.hibernate.dialect.Oracle10gDialect" />
            <property name="hibernate.c3p0.max_size" value="30" />
            <property name="hibernate.c3p0.min_size" value="5" />
            <property name="hibernate.c3p0.idle_test_period"
                value="3000" />
            <property name="hibernate.c3p0.timeout" value="300" />
            <property name="hibernate.c3p0.max_statements"
                value="50" />
            <property name="hibernate.show_sql" value="true" />
            <property name="hibernate.format_sql" value="true" />
        </properties>
    </persistence-unit>
</persistence>

每个POJO类在类定义前还有如下注解:

@Entity
@Table(name = "[Table Name]")

我不认为这些是必要的,所以我尝试删除它们,但这会导致各种问题,所以我不认为这是要走的路:p

编辑: 它现在有效,请参阅答案,但我不知道为什么。 Hibernate 不再检测 hbm.xml 映射数据,因此,由于 POJO 类不包含任何映射数据,它应该无法从数据库中获取数据:-/。

【问题讨论】:

    标签: persistence java-6 hibernate-4.x


    【解决方案1】:

    明显改变

    <property name="hibernate.archive.autodetection"
                    value="class, hbm" />
    

    到

    <property name="hibernate.archive.autodetection"
                    value="class" />
    

    我不完全确定为什么:p

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-18
      • 2017-09-04
      • 2011-12-16
      • 2015-04-28
      • 2018-02-06
      • 2014-04-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多