blo*_*low 1 java spring hibernate transactional
我写了这个简单的例子:
//file TestController.java
public interface TestController {
public List<Test> findAll();
}
//file TestControllerImp.java
@Controller
public class TestControllerImp implements TestController{
@Autowired
private SessionFactory sessionFactory;
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory=sessionFactory;
}
public List<Test> findAll() {
return sessionFactory.getCurrentSession().createQuery("from Test").list();
}
}
//file TestService.java
@Service
public class TestService {
@Autowired
private TestController controller;
public boolean flag=true;
public void setController(TestController controller){
this.controller=controller;
}
@Transactional
public List<Test> useController(){
flag=false;
return controller.findAll();
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的尝试:
TestService s1=context.getBean(TestService.class);
TestService s2=context.getBean(TestService.class);
List<Test> list=s1.useController();
System.out.println(s1.flag+" "+s2.flag);
Run Code Online (Sandbox Code Playgroud)
现在奇怪的行为(即时通讯非常新的春天):
@Transactional方法"useController()",则输出为:true true@Transactional从TestService到TestControllerImp,我宣布"的findAll()"用@Transactional,输出为:虚假.为什么我有这种行为?我知道默认@Autowired类是单音,但为什么在第一种情况下标志仍然是真的?
谢谢大家.
@Transactional机制默认使用JDK代理,仅适用于接口.
所以如果你让它TestService成为一个接口并TestServiceImpl成为它的实现,那么上面的代码应该可行.
例如,将类声明更改为:
@Service
public class TestServiceImpl implements TestService {
Run Code Online (Sandbox Code Playgroud)
但测试代码必须引用接口,而不是类:
// this code remains unchanged
TestService s1=context.getBean(TestService.class);
TestService s2=context.getBean(TestService.class);
Run Code Online (Sandbox Code Playgroud)
参考:
<tx:advice/>设置(Spring参考)@Transactional(Spring参考)| 归档时间: |
|
| 查看次数: |
1044 次 |
| 最近记录: |