【问题标题】:Duplicate XML entry | Hibernate orm.xml重复的 XML 条目 |休眠 orm.xml
【发布时间】:2016-11-12 21:53:30
【问题描述】:

这是一个错误:

Exception in thread "main" javax.persistence.PersistenceException: Unable to build entity manager factory
    at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:66)
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:55)
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:39)
    at ru.leon0399.podius.home.Core.run(Core.java:39)
    at ru.leon0399.podius.home.Core.main(Core.java:34)
Caused by: java.lang.IllegalStateException: Duplicate XML entry for ru.leon0399.podius.common.entity.AbstractEntity
    at org.hibernate.cfg.annotations.reflection.XMLContext.addClass(XMLContext.java:140)
    at org.hibernate.cfg.annotations.reflection.XMLContext.addDocument(XMLContext.java:108)
    at org.hibernate.boot.model.source.internal.annotations.AnnotationMetadataSourceProcessorImpl.<init>(AnnotationMetadataSourceProcessorImpl.java:93)
    at org.hibernate.boot.model.process.spi.MetadataBuildingProcess$1.<init>(MetadataBuildingProcess.java:147)
    at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:141)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:857)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:884)
    at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:58)
    ... 4 more

这是我的 orm.xml:

<?xml version="1.0" encoding="UTF-8"?>
<entity-mappings
    xmlns="http://java.sun.com/xml/ns/persistence/orm"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm_2_0.xsd"
    version="2.0">
<mapped-superclass class="ru.leon0399.podius.common.entity.AbstractEntity">
    <attributes>
        <id name="uuid">
            <column name="uuid" column-definition="BINARY(16)"/>
        </id>
        <basic name="createdAt">
            <column name="created_at" updatable="false"/>
            <temporal>TIMESTAMP</temporal>
        </basic>
        <basic name="updatedAt">
            <column name="updated_at"/>
            <temporal>TIMESTAMP</temporal>
        </basic>
    </attributes>
</mapped-superclass>

这是我的 AbstractEntity 类

public abstract class AbstractEntity implements Creatable, Updatable, Entity {
    private static final long serialVersionUID = 2544875895016856663L;

    private static final Logger LOGGER = LoggerFactory.getLogger(AbstractEntity.class);

    private UUID uuid = UUID.randomUUID();

    private Date updatedAt;

    private Date createdAt;

    // Getters and setters
}

如您所见,没有重复

调试后,我明白,那个文件orm.xml 被读取了两次! 这是确认此想法的屏幕截图

那么我怎样才能告诉 Hibernate 不要读取这个文件两次呢?

【问题讨论】:

  • 我猜 AbstractEntity 没有注释为 MappedSuperclass 对吧?
  • 你能给我们展示一下 AbstractEntity 类吗?
  • @aksappy 我已经更新了我的主题
  • @Apostolos 我没有在代码中用任何注释注释任何类

标签: java xml hibernate orm


【解决方案1】:

这是一个老问题,但可能是当前的问题,对我来说也是如此......

我遇到了完全相同的问题,并且刚刚发现如果我删除 persistence.xml 中对 orm.xml 文件的引用,它就会停止发生。

&lt;mapping-file&gt;./META-INF/orm.xml&lt;/mapping-file&gt;

或者,如果我将其重命名为 mapping.xml 而不是 orm.xml 并将其重新映射为 persistence.xml,它也可以工作。

&lt;mapping-file&gt;./META-INF/mapping.xml&lt;/mapping-file&gt;

Hibernate 似乎默认会查找这样的文件 (orm.xml),并且在 persistence.xml 已经提到它的情况下不会阻止它被加载两次。

因此,只需重命名并重新映射它,或者更简单,删除 persistence.xml 中的引用。

【讨论】:

    猜你喜欢
    • 2014-04-13
    • 2013-03-25
    • 1970-01-01
    • 2010-10-29
    • 2014-06-26
    • 2020-02-18
    • 2018-05-16
    • 1970-01-01
    • 2021-12-02
    相关资源
    最近更新 更多