Hibernate学习过程中的一些知识点及代码demo分析
Hibernate
待研究的问题:
1) @Transactional 资料说这个注解可以放在接口定义或接口方法 或类的定义或公有方法上
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
proxy-target-class="true" /> //居于CGLIB
有这么一个类它本省继承了一个抽象类,其中抽象类无注解
抽象类采用了模板模式:
public boolean logHandler() throws FileNotFoundException, Exception
{
BufferedReader reader=getReader();
parase(reader);//具体子类去实现
closeReader(reader);
return false;
}
@Service("sysconfig_A")
@Scope("prototype")
public class Sysconfig_A_Reader extends AbstractLogReader
{
parase
{
insertToDb
}
@Transactional(propagation=Propagation.REQUIRED,rollbackFor=Exception.class) //不生效
public void insertToDb(Sysconfig_A sysconfig_A,List slots)
{
logDao.save(sysconfig_A);
for(Sysconfig_A_Slot sysconfig_A_Slot : slots)
{
sysconfig_A_Slot.setSysconfig_A(sysconfig_A);
logDao.save(sysconfig_A_Slot);
}
}
}
为什么在抽象类变成:
@Service
@Transactional
public abstract class AbstractLogReader 则生效
目前例子发现:
比如A类定义了2个方法
public void go(Storage s) throws Exception {
save(Storage s)
}
@Transactional(rollbackFor=Exception.class)
public void save(Storage s) throws Exception{
s.set(....
)
logDao.save(s);
if(1==1)
{ throw new RuntimeException("my excep");}
}
B类调用A类的save方法则回滚
B类调用A类的go方法则不回滚
可用AOP思想解释:Aop就是是居于CGLIB或JDK动态代理实现,生成的类是代理类,A@CGLib在go方法什么也没加,而自身方法go调save方法 @Transactional不生效,而A@CGLib直接调用save则@Transactional被拦截,加入了前后一些操作
public Object intercept(Object obj, Method method, Object[] args,
MethodProxy proxy)
{
事物开启
Object result = proxy.invokeSuper(obj, args); // save();
事物提交或回滚
}
这也是自身方法调用事物嵌套NESTED不生效的原因
1) @Transactional 资料说这个注解可以放在接口定义或接口方法 或类的定义或公有方法上
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
有这么一个类它本省继承了一个抽象类,其中抽象类无注解
抽象类采用了模板模式:
public boolean logHandler() throws FileNotFoundException, Exception
{
BufferedReader reader=getReader();
parase(reader);//具体子类去实现
closeReader(reader);
return false;
}
@Service("sysconfig_A")
@Scope("prototype")
public class Sysconfig_A_Reader extends AbstractLogReader
{
parase
{
insertToDb
}
@Transactional(propagation=Propagation.REQUIRED,rollbackFor=Exception.class) //不生效
public void insertToDb(Sysconfig_A sysconfig_A,List slots)
{
logDao.save(sysconfig_A);
for(Sysconfig_A_Slot sysconfig_A_Slot : slots)
{
sysconfig_A_Slot.setSysconfig_A(sysconfig_A);
logDao.save(sysconfig_A_Slot);
}
}
}
为什么在抽象类变成:
@Service
@Transactional
//public abstract class AbstractLogReader 则生效
//目前例子发现:
//比如A类定义了2个方法
public void go(Storage s) throws Exception {
save(Storage s)
}
@Transactional(rollbackFor=Exception.class)
public void save(Storage s) throws Exception{
s.set(....
)
logDao.save(s);
if(1==1)
{ throw new RuntimeException("my excep");}
}
B类调用A类的save方法则回滚
B类调用A类的go方法则不回滚
可用AOP思想解释:Aop就是是居于CGLIB或JDK动态代理实现,生成的类是代理类,A@CGLib在go方法什么也没加,而自身方法go调save方法 @Transactional不生效,而A@CGLib直接调用save则@Transactional被拦截,加入了前后一些操作
public Object intercept(Object obj, Method method, Object[] args,
MethodProxy proxy)
{
事物开启
Object result = proxy.invokeSuper(obj, args); // save();
事物提交或回滚
}
这也是自身方法调用事物嵌套NESTED不生效的原因
本文来源 我爱IT技术网 http://www.52ij.com/jishu/5313.html 转载请保留链接。
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
