Spring@transactional注释用法
如果我没有将@Transactional annotation放在limsservice的审核方法上,审核日志将不会持久化。但persistenceService中的Persistence metod已准备好此批注。为什么我必须放此批注Spring@transactional注释用法,spring,transactional,Spring,Transactional,如果我没有将@Transactional annotation放在limsservice的审核方法上,审核日志将不会持久化。但persistenceService中的Persistence metod已准备好此批注。为什么我必须放此批注 @RequestMapping(value = "/lemf", method = RequestMethod.POST, headers = "Accept=application/json") public @ResponseBody
@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”),则代理和编织基础结构无法识别事务设置,并且对象不会包装在事务代理中,这绝对是不好的