【问题标题】:Hibernate entities not being found unless manually specified in persistence.xml除非在 persistence.xml 中手动指定,否则找不到 Hibernate 实体
【发布时间】:2015-02-03 11:54:21
【问题描述】:

我有两个应用程序,

App - main app : depends on lib
lib - secondary app.

使用spring boot我正在为app生成可执行jar文件,这样lib的jar就在jar的lib文件夹中(my.jar!/lib/lib.jar)

我用的是hibernate,配置如下

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" 
    depends-on="fakeJpaProperties,fakeDataSource">
    <property name="persistenceUnitName" value="fake" />
    <property name="persistenceUnitManager">
        <bean class="my.persistence.MergingPersistenceUnitManager">
            <property name="persistenceXmlLocations">
                <list>
                    <value>classpath*:META-INF/fake/persistence.xml</value>
                </list>
            </property>
        </bean>
    </property>
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
            <property name="generateDdl" value="false" />
        </bean>
    </property>
    <property name="packagesToScan" value="my.path.to.lib.data.card" />
</bean>

以下persistence.xml在lib中

<persistence-unit name="fake" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <non-jta-data-source>fake</non-jta-data-source>
    <shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>
</persistence-unit>

在应用程序中使用这个 persistence.xml

<persistence-unit name="fake" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <non-jta-data-source>fake</non-jta-data-source>
    <shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>
    <jar-file>lib/lib.jar</jar-file>
</persistence-unit>

但是我得到了一个:

  org.hibernate.MappingException: Unknown entity: my.path.to.lib.data.card.FakeData
    at org.hibernate.internal.SessionFactoryImpl.getEntityPersister(SessionFactoryImpl.java:1096)
    at org.hibernate.internal.SessionImpl.locateEntityPersister(SessionImpl.java:2565)
    at org.hibernate.internal.SessionImpl.access$1900(SessionImpl.java:176)
    at org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.<init>(SessionImpl.java:2504)
    at org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.<init>(SessionImpl.java:2508)
    at org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.<init>(SessionImpl.java:2495)
    at org.hibernate.internal.SessionImpl.byId(SessionImpl.java:1043)
    at org.hibernate.internal.SessionImpl.get(SessionImpl.java:1023)
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.find(AbstractEntityManagerImpl.java:1104)
    ... 91 common frames omitted

如果我在 lib 的 persistence.xml 中添加:&lt;class&gt;my.path.to.lib.data.card.FakeData&lt;/class&gt;,则异常不起作用。但是,我不想手动指定所有实体,这就是为什么我的 entityManagerFactory 包含"packagesToScan",但似乎没有被扫描。

如何让 packagestoScan 工作?


编辑:

我发现here 如果存在persistence.xml,则忽略packagesToScan。在我的情况下,由于依赖于其他几个需要它的共享项目,我无法删除所有 persistence.xml。有没有办法指定一个包/通配符而不是在 persistence.xml 中列出每个单独的&lt;class&gt;

【问题讨论】:

    标签: java xml spring hibernate spring-boot


    【解决方案1】:

    有没有办法指定一个包/通配符而不是在 persistence.xml 中列出每个人?

    AFAIK 是指定 JPA 的方式,所以如果你使用persistence.xml,那就是你必须忍受的。

    【讨论】:

      【解决方案2】:

      尝试给你的spring boot配置类添加@EntityScan注解:

      @Configuration
      @EntityScan(basePackages="my.path.to.lib.data.card")
      public class application {
      
          public static void main(String[] args) {
              SpringApplication.run(application.class, args);
          }
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-08-08
        • 1970-01-01
        • 2018-10-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-20
        相关资源
        最近更新 更多