0


一开始,我已经尝试了各种论坛中提到的选项,以获得相同的堆栈跟踪。其中一些在与其他人一起工作时不起作用(比如删除 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 模型中的一个字段,但不明白为什么?

谢谢,
稻田

4

0 回答 0