Java Spring&x27;不使用EntityManager持久化实体,但使用Spring数据持久化实体

Java Spring&x27;不使用EntityManager持久化实体,但使用Spring数据持久化实体,java,spring,hibernate,jpa,spring-transactions,Java,Spring,Hibernate,Jpa,Spring Transactions,也许这太普遍了,但仍然如此 我有一个小的测试项目,我正在测试所有JPA的东西。几乎在我使用Spring数据和JPA存储库的任何地方都可以正常工作。但现在我正试图让我的服务保存实体。该服务的外观如下所示: @Service public class SomeServiceImpl implements SomeService { @Autowired private EntityManagerFactory entityManagerFactory; public Som

也许这太普遍了,但仍然如此

我有一个小的测试项目,我正在测试所有JPA的东西。几乎在我使用Spring数据和JPA存储库的任何地方都可以正常工作。但现在我正试图让我的服务保存实体。该服务的外观如下所示:

@Service
public class SomeServiceImpl implements SomeService {
    @Autowired
    private EntityManagerFactory entityManagerFactory;

    public SomeServiceImpl(EntityManagerFactory entityManagerFactory) {
        this.entityManagerFactory = entityManagerFactory;
    }

    @Override
    @Transactional
    public SomeEntity save(SomeEntity someEntity) {
        EntityManager entityManager = entityManagerFactory.createEntityManager();
        entityManager.persist(someEntity);

        return someEntity;
}
持久性配置如下所示(我有意复制和粘贴整个配置。也许这会帮助您重现错误):

还有一个我计划配置应用程序其余部分的地方(放在同一个包中):

我曾尝试调试Spring,但所有这些都未能检测到JPA存储库的事务行为和我的服务之间的差异。我看到交易被创建,甚至被提交。但在JPA存储库中,它得到了保存,而在我的服务实现中,它确实生成了ID,但数据库中没有出现实体

我正在运行测试中的所有内容,通过接口自动连接服务:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { AppConfig.class, PersistenceConfig.class })
public class AllTheTests {
    @Autowired
    SomeService someService;

    ...
}
非常感谢您的建议


EDIT添加
entityManager.flush()
调用生成的
嵌套异常为javax.persistence.TransactionRequiredException:没有正在进行的事务

问题是否仅出现在测试中,还是也出现在产品中?@Maciej Kowalski它只是测试项目。仅出于教育目的,将
EntityManager
导入,而不是
EntityManager工厂
。您正在自己创建一个新的、新的、非托管的
EntityManager
实例。@M.Deinum谢谢您的建议,但是如果我为整个应用程序的服务注入
EntityManager
,我将有一个实例,我希望每次都再创建一个。我理解错了什么吗?你的理解错了。Spring将实际注入一个代理,每次需要时,您都会有一个新的事务绑定
EntityManager
@Configuration
@ComponentScan(basePackages = "com.dropbinc.learning.jpa")
public class AppConfig {
}
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { AppConfig.class, PersistenceConfig.class })
public class AllTheTests {
    @Autowired
    SomeService someService;

    ...
}