一开始,我已经尝试了各种论坛中提到的选项,以获得相同的堆栈跟踪。其中一些在与其他人一起工作时不起作用(比如删除 javax.persistence.transactiontype)我不明白如何以及在哪里尝试它。
我正在使用 Spring Boot 数据 JPA (1.2 RC2) + Hibernate(带有自定义的 persistence.xml)。这是我的 Application.java
@Configuration
@ComponentScan(<our package>)
@EnableAutoConfiguration(exclude = EmbeddedServletContainerAutoConfiguration.class)
@EnableTransactionManagement
@DependsOn("transactionManager")
@EnableJpaRepositories(transactionManagerRef = "transactionManager")
public class Application {
public static void main(String[] args) {
run(Application.class, args);
}
}
我的 RepositoryConfiguration(因为我们有自定义的 persistence.xml - 目前需要重用它)
@Configuration
public class RepositotyConfiguration {
@Autowired
private DataSource dataSource;
@Value("${db.dialect}")
private String dialectClass;
@Bean(name = "entityManagerFactory")
public LocalContainerEntityManagerFactoryBean entityManagerFactory(EntityManagerFactoryBuilder builder) {
LocalContainerEntityManagerFactoryBean entityManagerFactory = builder.dataSource(dataSource).
persistenceUnit("main").build();
entityManagerFactory.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
Properties additionalProperties = new Properties();
additionalProperties.put("hibernate.dialect", dialectClass);
entityManagerFactory.setJpaProperties(additionalProperties);
return entityManagerFactory;
}
@Bean(name = "transactionManager")
public PlatformTransactionManager transactionManager(LocalContainerEntityManagerFactoryBean entityManagerFactoryBean) {
JpaTransactionManager txManager = new JpaTransactionManager();
txManager.setEntityManagerFactory(entityManagerFactoryBean.getObject());
return txManager;
}
}
如果我没有单个存储库,则会在此处创建 transactionManager,但是当我添加一个存储库时,任何测试都会失败,并出现以下异常:
Caused by: java.lang.NullPointerException
at org.hibernate.engine.transaction.internal.jta.JtaStatusHelper.getStatus(JtaStatusHelper.java:76)
at org.hibernate.engine.transaction.internal.jta.JtaStatusHelper.isActive(JtaStatusHelper.java:118)
at org.hibernate.engine.transaction.internal.jta.CMTTransaction.join(CMTTransaction.java:149)
我的测试应用程序上下文是:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
@WebAppConfiguration
@EnableAutoConfiguration
@TransactionConfiguration(transactionManager = "transactionManager")
@IntegrationTest("server.port:0")
@ActiveProfiles("test")
public abstract class TestApplicationContext {
@Autowired
private WebApplicationContext wac;
@Value("${local.server.port}")
private int port;
...
}
我尝试添加的存储库的示例(不是实际的)(假设 Item 是模型对象)
public interface ItemRepository extends CrudReposity<Item, Long> {
Item findByCode(String code); // this seems to cause the problem, assume 'code' is field in Item
}
任何指针都会有最大的帮助。
编辑:现在只有当我在 ItemRepository 中添加额外的方法说 Item findByItemCode(String itemCode) 时才会失败,让我们说 itemCode 是 Item 模型中的一个字段,但不明白为什么?
谢谢,
稻田