Spring 启动测试 - 使用 2 个数据库时 EntityManager 不持久
Spring boot test - EntityManager does not persist when using 2 databases
我有 Spring 控制器启动测试:
@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class ExampleTest {
@Autowired
private MockMvc mockMvc;
@Autowired
private ExampleDAO;
@Test
public void someTest(){
exampleDAO.save(someEntity);
// call to endpoint
}
}
我有两个数据库配置:
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(entityManagerFactoryRef = "primaryManagerFactory", basePackages = { "com.example.repository.primary" })
public class PrimaryDbConfig {
和
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(entityManagerFactoryRef = "anotherManagerFactory", basePackages = { "com.example.repository.another" })
public class AnotherDbConfig {
测试属性片段:
spring.primary.datasource.url=jdbc:h2:mem:primary;DB_CLOSE_ON_EXIT=FALSE
spring.primary.datasource.username=sa
spring.primary.datasource.password=
spring.primary.datasource.driverClassName=org.h2.Driver
spring.another.datasource.url=jdbc:h2:mem:another;DB_CLOSE_ON_EXIT=FALSE
spring.another.datasource.username=sa
spring.another.datasource.password=
spring.another.datasource.driverClassName=org.h2.Driver
spring.jpa.properties.hibernate.show_sql=true
GenericDAOImpl 片段:
@PersistenceContext(unitName = "another-persistence-unit")
protected EntityManager entityManager;
@Override
@Transactional
public void save(T entity) {
entityManager.persist(entity);
}
当我运行 测试时,exampleDAO.save(someEntity)
方法不会将任何SQL 保存或输出到日志。 exampleDAO
不是主要数据源。
如果我改为:
@Override
@Transactional
public void save(T entity) {
entityManager.unwrap(Session.class).save(entity);
}
它运行良好并且持久化数据。但是,使用主数据源 DAO 的相同方法会持久化具有 EntityManager
的实体。
为什么用 Session
保存实体而不用 EntityManager
保存实体?
如果使用两个数据库,应该创建单独的 TransactionManager-s 并指定
@Override
@Transactional("transactionManagerName")
public void save(T entity) {
entityManager.persist(entity);
}
我有 Spring 控制器启动测试:
@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class ExampleTest {
@Autowired
private MockMvc mockMvc;
@Autowired
private ExampleDAO;
@Test
public void someTest(){
exampleDAO.save(someEntity);
// call to endpoint
}
}
我有两个数据库配置:
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(entityManagerFactoryRef = "primaryManagerFactory", basePackages = { "com.example.repository.primary" })
public class PrimaryDbConfig {
和
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(entityManagerFactoryRef = "anotherManagerFactory", basePackages = { "com.example.repository.another" })
public class AnotherDbConfig {
测试属性片段:
spring.primary.datasource.url=jdbc:h2:mem:primary;DB_CLOSE_ON_EXIT=FALSE
spring.primary.datasource.username=sa
spring.primary.datasource.password=
spring.primary.datasource.driverClassName=org.h2.Driver
spring.another.datasource.url=jdbc:h2:mem:another;DB_CLOSE_ON_EXIT=FALSE
spring.another.datasource.username=sa
spring.another.datasource.password=
spring.another.datasource.driverClassName=org.h2.Driver
spring.jpa.properties.hibernate.show_sql=true
GenericDAOImpl 片段:
@PersistenceContext(unitName = "another-persistence-unit")
protected EntityManager entityManager;
@Override
@Transactional
public void save(T entity) {
entityManager.persist(entity);
}
当我运行 测试时,exampleDAO.save(someEntity)
方法不会将任何SQL 保存或输出到日志。 exampleDAO
不是主要数据源。
如果我改为:
@Override
@Transactional
public void save(T entity) {
entityManager.unwrap(Session.class).save(entity);
}
它运行良好并且持久化数据。但是,使用主数据源 DAO 的相同方法会持久化具有 EntityManager
的实体。
为什么用 Session
保存实体而不用 EntityManager
保存实体?
如果使用两个数据库,应该创建单独的 TransactionManager-s 并指定
@Override
@Transactional("transactionManagerName")
public void save(T entity) {
entityManager.persist(entity);
}