我正在学习使用JPA。我有点困惑。
根据JPA,EntityManager管理事务。但是一种设计模式是将EntityManager注入DAO中。那么不同的实体管理器怎么可能是同一个事务呢?
这是我要解决的案子
我定义了 DAO
@Repository
JPARepository1 {
@PersistenceContext
protected EntityManager em;
....
.
@Repository
JPARepository2 {
@PersistenceContext
protected EntityManager em;
....
我有一个服务。
@Service
public class ServiceImpl1 {
@Autowired
private JPARepository1 repo1;
@Autowired
private JPARepository2 repo2;
public void mainMethod(){
Object o= transactionalMethod1();
try{
transactionalMethod2(o);
}catch (Exception e){
transactionalMethod3(o);
}
}
private Object transactionalMethod1(){
....
}
private void transactionalMethod2(Object o){
....
}
private void transactionalMethod3(Object o){
....
}
然后从@Controller,我将调用main Method()。在同一个服务中并使用同一个存储库中,对transactionalMED1、transactionalMED2和transactionalMED3进行事务性处理的正确方法是什么?我希望如果transactionalMED2中有exeption,这会中止事务,但保留transactionalMED1和transactionalMED3的事务。谢谢,对不起,我的英语。
通常,您配置一个实体管理器,因此有线管理器始终是相同的,即您配置的管理器。但是,此管理器的实例在每次布线中都是不同的。
因此,服务中的每个事务都使用EntityManager的不同实例,因此调用的每个事务都是相互分离的。
因此,< code > transactional method 2 中的异常不一定会影响< code > transactional method 1 和< code > transactional method 3
在同一服务内并使用同一存储库的情况下,对transactionalMethod1、transactionaryMethod2和transactional Method3进行事务处理的正确方式是什么。
现在,您有两个选项来执行服务方法事务
1) 您可以这样注释整个@Service
:
@Service
@Transactional
public class ServiceImpl1 {
....
所以这里声明的每个方法也是一个事务。
2)您可以将每个方法注释为@Transactional
:
@Transactional
private Object transactionalMethod1(){
....
}
@Transactional
private void transactionalMethod2(Object o){
....
}
@Transactional
private void transactionalMethod3(Object o){
....
}
如果要使用单个存储库,只需@Autowired
单个存储库并在@Transactional
method中使用。例如:
@Service
@Transactional
public class ServiceImpl1 {
@Autowired
private JPARepository1 repo1;
public void mainMethod(){
Object o= transactionalMethod1();
try{
transactionalMethod2(o);
}catch (Exception e){
transactionalMethod3(o);
}
}
private Object transactionalMethod1(){
return repo1.findOne();
}
private void transactionalMethod2(Object o){
repo1.create(o);
}
private void transactionalMethod3(Object o){
repo1.delete(o)
}
我使用的是Querydsl 2.9、Spring Data JPA 1.3.0和Hibernate JPA 2 API 1.0版。我试图在两个表和之间进行简单的连接,连接到列。由于某些原因,Hibernate执行的查询中总是有一个额外的。这些表格如下所示: 但是,实际运行的查询是这样的: 请注意结尾处额外的。我意识到,如果在上执行可以得到正确的结果,但我不希望在不需要的情况下增加的额外开销。我尝试
我还没有找到在QueryDSL中声明这种SQL的任何方法。我能够编写两个select语句,但是我仍然无法将它们与结合起来。 最后,我想检索一个与给定查询匹配的ID列表。通常,相交的数量可以是20或30左右,这取决于我要搜索的键/值对的数量。 有没有人知道如何使用QueryDSL执行类似的操作?
问题内容: 在JPA中,如果我们调用EntityTransaction.commit(),它会自动调用EntityManager.flush()吗?还是我们都应该称呼它们?有什么区别?因为我在使用JPA时遇到问题,所以当我向数据库中插入实体时,我会调用persist()。在数据库中,数据已插入(可以获取),但是该数据未显示在我的应用程序中(我使用findAll()进行获取)。在另一个实体上,它出现
在JPA中,如果我们调用EntityTransaction。commit(),它是否自动调用EntityManager。flush()?或者我们应该叫他们两个?有什么区别?因为我对JPA有问题,当我向数据库插入实体时,我调用persist()。在数据库中,数据已经插入(可以提取),但该数据没有显示在我的应用程序中(我使用findAll()提取)。在另一个实体上,它出现了。有什么我不知道的吗?我使用
我正在将Spring Boot项目与Spring批处理和数据jpa项目集成。所有与作业和数据配置相关的东西都是正确的,除了将我的作业编写器结果保存在数据库中。在我读取文件并对其进行处理后,我无法将其写入mysql数据库。没有错误,但也没有插入。有趣的是我的数据源已配置。因为在插入之前,我可以从数据库中获取示例记录。请协助我解决这个问题。 我的申请。属性: 批次配置: 道类: 作家类: temPer
问题内容: 对于新项目,JPA始终是推荐的用于处理关系数据的工具吗?或者在某些情况下,Spring JdbcTemplate是更好的选择?您的回应中应考虑以下因素: 新数据库架构与现有架构和表 开发人员专业知识水平 易于与数据缓存层集成 性能 还有其他需要考虑的因素吗? 问题答案: 如果您不想通过域模型访问数据库架构,请使用Spring JdbcTemplate。使用JdbcTemplate,您将