Spring@transactional注释用法

Spring@transactional注释用法,spring,transactional,Spring,Transactional,如果我没有将@Transactional annotation放在limsservice的审核方法上,审核日志将不会持久化。但persistenceService中的Persistence metod已准备好此批注。为什么我必须放此批注 @RequestMapping(value = "/lemf", method = RequestMethod.POST, headers = "Accept=application/json") public @ResponseBody

如果我没有将@Transactional annotation放在limsservice的审核方法上,审核日志将不会持久化。但persistenceService中的Persistence metod已准备好此批注。为什么我必须放此批注

  @RequestMapping(value = "/lemf", method = RequestMethod.POST, headers = "Accept=application/json")
    public
    @ResponseBody
    Lemf create(HttpServletResponse response, @RequestBody Lemf lemf) {
        try {
            Lemf l = limsService.findLemfByName(lemf.getName());
            if (l == null) {
                     lemf=   limsService.addLemf(lemf);
                    limsService.audit("User action",getRequestInfo(),"New lemf created.");
                     return  lemf;
            }
            sendError(response, "Lemf Allready exist.");


        } catch (ProviderException e) {
            sendError(response, e);
        }
        return null;
    }


public class PersistenceServiceImpl implements PersistenceService {

   @Transactional(readOnly = false)
    public <T extends Persistable> T persist(T obj) {
        if (obj.getSystemId() != AbstractPersistable.UNSAVED_ID_VALUE) {
            log.info("Updating... :" + obj);
            T merged = em.merge(obj);
            return merged;
        } else {
            em.persist(obj);
            return obj;
        }
    }

}


public class LimsServiceImpl implements LimsService {
  @Override
    public Lemf addLemf(Lemf lemf) throws ProviderException {
        return  persistenceService.persist(lemf);
    }

    @Transactional
    public void  audit(String type,Pair<String,String >  pair,String log)  {
         auditService. audit("User action", pair, "New lemf created.");
    }

}
@RequestMapping(value=“/lemf”,method=RequestMethod.POST,headers=“Accept=application/json”)
公众的
@应答器
lemfcreate(HttpServletResponse,@RequestBody Lemf-Lemf){
试一试{
Lemf l=limsService.findLemfByName(Lemf.getName());
if(l==null){
lemf=limsService.addLemf(lemf);
audit(“用户操作”,getRequestInfo(),“创建了新的lemf”);
返回lemf;
}
sendError(响应“Lemf Allready exist”);
}捕获(提供异常e){
发送错误(响应,e);
}
返回null;
}
公共类PersistenceServiceImpl实现PersistenceService{
@事务(只读=假)
公共T持久化(T obj){
if(obj.getSystemId()!=AbstractPersistable.UNSAVED_ID_值){
日志信息(“更新…:”+obj);
T合并=em.merge(obj);
返回合并;
}否则{
em.persist(obj);
返回obj;
}
}
}
公共类limsservicepimpl实现LimsService{
@凌驾
公共Lemf addLemf(Lemf Lemf)抛出ProviderException{
返回persistenceService.persist(lemf);
}
@交易的
公共作废审核(字符串类型、对、字符串日志){
auditService.audit(“用户操作”,配对,“新创建的lemf”);
}
}
弹簧参考章节

这一点非常清楚:

小费

Spring建议只使用@Transactional注释具体类(以及具体类的方法),而不是注释接口。当然,您可以将@Transactional注释放置在接口(或接口方法)上,但只有在使用基于接口的代理时,它才能起到预期的作用。Java注释不是从接口继承的这一事实意味着,如果您使用的是基于类的代理(proxy target class=“true”)或基于编织的方面(mode=“aspectj”),则代理和编织基础结构无法识别事务设置,并且对象不会包装在事务代理中,这绝对是不好的