如何只扫描一个具体的 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.EntityA
和 my.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 放在同一个包中?的主要内容,如果未能解决你的问题,请参考以下文章