簡體   English   中英

除非在persistence.xml中手動指定,否則找不到休眠實體

[英]Hibernate entities not being found unless manually specified in persistence.xml

我有兩個申請,

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

使用春季啟動,我正在為應用程序生成可執行的jar文件,這樣lib的jar就在jar的lib文件夾中(my.jar!/lib/lib.jar)

我正在使用以下配置的休眠模式

<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中添加<class>my.path.to.lib.data.card.FakeData</class> ,則該異常不起作用。 但是,我不想手動指定所有實體,這就是為什么我的entityManagerFactory包含"packagesToScan" ,但是似乎並未對此進行掃描。

我如何使軟件包toScan工作?


編輯:

我在這里發現,如果persistence.xml ,則packagesToScan被忽略。 就我而言,由於依賴於需要它的其他幾個共享項目,我無法刪除所有的persistence.xml 有沒有一種方法可以指定包/通配符,而不是在persistence.xml中列出每個單獨的<class>

有沒有一種方法可以指定包/通配符,而不是在persistence.xml中列出每個人?

AFAIK是指定JPA的方式,因此,如果要使用persistence.xml,那就必須使用它。

嘗試將@EntityScan批注添加到Spring Boot配置類:

@Configuration
@EntityScan(basePackages="my.path.to.lib.data.card")
public class application {

    public static void main(String[] args) {
        SpringApplication.run(application.class, args);
    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM