如何只扫描一个具体的 JPA 实体,但不是所有实体都使用 spring-boot 放在同一个包中?

Posted

技术标签:

【中文标题】如何只扫描一个具体的 JPA 实体,但不是所有实体都使用 spring-boot 放在同一个包中?【英文标题】:How just scan a concrete JPA entity but not all entities bellow the same package with spring-boot? 【发布时间】:2017-06-09 17:06:55 【问题描述】:

我在同一个包下有多个 JPA 实体,例如 my.package.po.EntityAmy.package.po.EntityB。使用下面的代码将自动扫描 EntityA 和 EntityB,但我只想扫描 EntityA。我该怎么做?

package my.package.dao;
...
@RunWith(SpringRunner.class)
@ContextConfiguration(classes = EntityADaoJpaImpl.class)
@DataJpaTest
@EntityScan(basePackageClasses = EntityA.class)
public class EntityADaoJpaImplTest 
    @Inject
    private TestEntityManager entityManager;
    @Inject
    private EntityADaoJpaImpl dao;
    //...

【问题讨论】:

看来你的问题在这里解决了:***.com/questions/16293437/… 那需要编写更复杂的代码。是否有类似 @EntityScan(classes = EntityA.class) 的东西? 【参考方案1】:

经过一番研究,特地遵循'ignore-some-classes-while-scanning-packagestoscan'的想法:

// add only required enitites from a libray
localContainerEntityManagerFactoryBean.setPersistenceUnitPostProcessors(new PersistenceUnitPostProcessor() 
  @Override
  public void postProcessPersistenceUnitInfo(MutablePersistenceUnitInfo persistenceUnit) 
    persistenceUnit.addManagedClassName("my.package.po.EntityA");
  
);

我做了一些自定义代码封装来简化我的单元测试:

package my.package.dao;
import tech.simter.test.jpa.EntityScan;
import tech.simter.test.jpa.JpaTestConfiguration;
...
@RunWith(SpringRunner.class)
@ContextConfiguration(classes = EntityADaoJpaImpl.class, JpaTestConfiguration.class)
@DataJpaTest
@EntityScan(EntityA.class)
public class EntityADaoJpaImplTest 
  @Inject
  private TestEntityManager entityManager;
  @Inject
  private EntityADaoJpaImpl dao;
  //...

它完全解决了我的问题。而代码封装思想来源于spring-boot-autoconfigureorg.springframework.boot.autoconfigure.domain.EntityScan类的实现。

我的源代码托管here。在github上。

【讨论】:

真正有用的解决方案。唯一的缺点是所选类不能与其他实体类有任何关联。否则实体管理器会尝试加载所有关联,但会失败。

以上是关于如何只扫描一个具体的 JPA 实体,但不是所有实体都使用 spring-boot 放在同一个包中?的主要内容,如果未能解决你的问题,请参考以下文章

如何克隆 JPA 实体

jpa hibernate中扫描太多实体时,glassfish启动很慢或内存泄漏

使用 JPA 原生查询时是不是必须选择所有实体属性?

解决Springboot项目中jpa扫描不到实体的问题

JPA:返回多个实体的查询

如何使用查询而不是带有 JPA 的 @JoinColumn 映射实体关联?