首先,我可能会问一些之前被问过和回答的问题,但我无法获得搜索结果.好的一般(或总是到目前为止:))我们通常在服务层上定义事务注释典型的spring hibernate crud
控制器 - >经理 - >道 - >奥姆.
我现在有一种情况需要在基于客户端站点的域模型之间进行选择.假设客户端A使用我的域模型一切都很好但是其他客户端站点会给我一个Web服务而不是使用我们的域模型.
我应该替换哪一层.我相信它必须是Dao,它将从Web服务中获取数据并将其发送回来.两个单独编写的Dao图层并根据场景插入.
我现在已经意识到,当我们在服务层中放置@Transactional时,我们一直在进行紧耦合(如果有这样的事情或说没有松耦合).这么多大脑不会错,或者是他们(我对此表示怀疑).
所以问题是"应该在哪里"@Transactional"放置服务层或DAO?" 是服务层向下我应该更换.
我在堆栈溢出文章中看到很多评论我发现@Transactional与@Service或@Controller一起使用的某些事情
"通常,应该在服务层进行交易."
"正常情况是在服务层级注释"
"认为事务属于服务层.它是了解工作单元和用例的人.如果你有几个DAO注入到需要在单个事务中协同工作的服务,那么这是正确的答案." [资源]
使用带有@service层的@transactional的缺点
如果我有2个方法,例如saveUser()和saveEmail()(因为我将电子邮件存储在数据库中以便稍后发送 - 就像一个队列)我会在我的服务中创建一个方法saveUserAndSendEmail(用户用户),它将是事务性的.[资源]
这意味着我在服务层创建了许多方法,而不是一个Save Generic Method,如下所示
public <T> long save(T entity) throws DataAccessException {
Session session = sessionFactory.getCurrentSession();
long getGenVal=(Long) session.save(entity);
return getGenVal;
}
Run Code Online (Sandbox Code Playgroud)
根据上面的解决方案,这意味着我们有很多方法,如以下LOL ..
public <T> long saveAccount(T entity)....
public <T> long saveWithAuditLog(T entity, K entity1)....
public <T> long saveWithAuditLogAndEntries(T entity, K entity, M entity)....
克服这种情况
我在@Controller中使用@Transactional,只需制作一个通用保存方法,并使用这个简单的保存方法保存所有实体/模型.如果任何方法无法保存,则控制器中的所有事务都会成功回滚.
确保@Transactional应与@Controller一起使用的其他情况
在@Controller中:
pt.save(entity1);
pt.save(entity2);
int a = 2/0;
pt.save(entity3);
Run Code Online (Sandbox Code Playgroud)
如果@Transactional on Service,前2个实体成功保存,但第三个不回滚所有事务
如果@Tratroller上的@Transactional,所有事务回滚都会发生异常
为什么堆栈溢出问道,"不要在控制器中进行事务处理.将它们放在服务层类中."? [资源]