如何在 HibernateJpaAutoConfiguration 中指定 packagesToScan?

Posted

技术标签:

【中文标题】如何在 HibernateJpaAutoConfiguration 中指定 packagesToScan?【英文标题】:How to specify packagesToScan in HibernateJpaAutoConfiguration? 【发布时间】:2014-10-11 13:23:33 【问题描述】:

我在 Spring 单元测试中直接使用HibernateJpaAutoConfiguration。在配置 Hibernate 和 EntityManager 时,不会扫描任何实体。

例外

10:29:36.377 [main] INFO  o.s.b.f.a.AutowiredAnnotationBeanPostProcessor - JSR-330 javax.inject.Inject' annotation found and supported for autowiring
10:29:36.505 [main] TRACE o.s.b.b.PropertiesConfigurationFactory - Property Sources: org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor$FlatPropertySources@65f8f5ae
10:29:36.638 [main] TRACE o.s.b.b.PropertiesConfigurationFactory - Property Sources: org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor$FlatPropertySources@65f8f5ae
10:29:36.716 [main] TRACE o.s.b.b.PropertiesConfigurationFactory - Property Sources: org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor$FlatPropertySources@65f8f5ae
10:29:36.818 [main] INFO  o.s.o.j.LocalContainerEntityManagerFactoryBean - Building JPA container EntityManagerFactory for persistence unit 'default'
10:29:36.842 [main] INFO  o.h.jpa.internal.util.LogHelper - HHH000204: Processing PersistenceUnitInfo [
    name: default
    ...]
10:29:36.979 [main] INFO  org.hibernate.Version - HHH000412: Hibernate Core 4.3.6.Final
10:29:36.980 [main] INFO  org.hibernate.cfg.Environment - HHH000206: hibernate.properties not found
10:29:36.982 [main] INFO  org.hibernate.cfg.Environment - HHH000021: Bytecode provider name : javassist
10:29:37.234 [main] INFO  o.h.annotations.common.Version - HCANN000001: Hibernate Commons Annotations 4.0.4.Final
10:29:37.599 [main] INFO  org.hibernate.dialect.Dialect - HHH000400: Using dialect: org.hibernate.dialect.PostgreSQL9Dialect
10:29:37.608 [main] INFO  o.h.e.j.internal.LobCreatorBuilder - HHH000424: Disabling contextual LOB creation as createClob() method threw error : java.lang.reflect.InvocationTargetException
10:29:37.648 [main] INFO  o.h.h.i.a.ASTQueryTranslatorFactory - HHH000397: Using ASTQueryTranslatorFactory
10:29:37.742 [main] INFO  o.h.tool.hbm2ddl.SchemaUpdate - HHH000228: Running hbm2ddl schema update
10:29:37.742 [main] INFO  o.h.tool.hbm2ddl.SchemaUpdate - HHH000102: Fetching database metadata
10:29:37.744 [main] INFO  o.h.tool.hbm2ddl.SchemaUpdate - HHH000396: Updating schema
10:29:37.745 [main] INFO  o.h.tool.hbm2ddl.SchemaUpdate - HHH000232: Schema update complete

我的解决方法是创建自己的LocalContainerEntityManagerFactoryBean,如下所示:

    final LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean();
    factoryBean.setPersistenceUnitName("buzzPU"); // persistence.xml
    factoryBean.setDataSource(dataSource);
    factoryBean.setJpaVendorAdapter(jpaVendorAdapter);
    factoryBean.setPersistenceXmlLocation("classpath*:META-INF/donotparsepersistence.xml");
    factoryBean.setPackagesToScan("org.soluvas.buzz.core.jpa");

请注意,我不使用META-INF/persistence.xml

【问题讨论】:

【参考方案1】:

使用以下方法也有帮助:

@EntityScan("org.soluvas.buzz.core.jpa")

它是 'basePackages' 属性的别名,它配置一个包列表以扫描带注释的实体。

此注释提供了手动设置的替代方法 LocalContainerEntityManagerFactoryBean.setPackagesToScan(String...) 如果您想在 一种类型安全的方式,或者如果您的 LocalContainerEntityManagerFactoryBean 是 自动配置

【讨论】:

【参考方案2】:

来自 Spring Boot 参考...

62.4 Separate @Entity definitions from Spring configuration

Spring Boot 会根据找到的 @EnableAutoConfiguration 尝试猜测您的 @Entity 定义的位置。要获得更多控制,您可以使用@EntityScan 注释,例如

@Configuration
@EnableAutoConfiguration
@EntityScan(basePackageClasses=City.class)
public class Application 
   //...

【讨论】:

使用 org.springframework.boot.autoconfigure.domain.EntityScan 而不是 org.springframework.boot.orm.jpa.EntityScan 已弃用。 奇怪的是EntityScan 对我来说是不够的,我还需要设置CoponentScan。但是遇到问题似乎只使用它在实体类中找到的“第一个”包,而且我有一个数字(来自不同的依赖项)。

以上是关于如何在 HibernateJpaAutoConfiguration 中指定 packagesToScan?的主要内容,如果未能解决你的问题,请参考以下文章

如何在表单提交后保留文本(如何在提交后不删除自身?)

如何在异步任务中调用意图?或者如何在 onPostExecute 中开始新的活动?

在 Avkit 中如何使用这三行代码,以及如何将音乐静音”

如何在 JDBC 中启动事务?

如何在 Fragment 中调用 OnActivityResult 以及它是如何工作的?

如何使用 Firebase 在 Web 上托管 Flutter?它的效果如何?