这次小结的是ejb3中的事务,举例子说明之:
public void addMultiStudent() {
for(int i=0; i<10; i++){
Student student = new Student();
student.setName("Student_"+i);
em.persist(student);
if(i==5){
//抛出RuntimeException会导致事务的回滚操作
throw new RuntimeException("随便一个异常");
}
注意的是,凡是runtimeexception的异常,事务将肯定回滚掉的,所以上面的数据不能插入的.
再看
public void addMultiStudent2() {
for(int i=0; i<10; i++){
Student student = new Student();
student.setName("Student_"+i);
em.persist(student);
if(i==5){
//抛出RuntimeException及其子类也会导致事务的回滚
//但如果在MyException1上用注解@ApplicationException(rollback=false)
//可以改变其默认回滚规则!
throw new MyException1("随便一个异常");
}
}
}
其中myecxception1.java为:
//@ApplicationException(rollback=false)
public class MyException1 extends RuntimeException {
如果@ApplicationException(rollback=false)则不回滚了
public void addMultiStudent3() throws MyException2{
for(int i=0; i<10; i++){
Student student = new Student();
student.setName("Student_"+i);
em.persist(student);
if(i==5){
//抛出Exception及其子类(不包括RuntimeException)不会导致事务的回滚
//但如果在MyException1上用注解@ApplicationException(rollback=true)
//可以改变其默认回滚规则!
throw new MyException2("随便一个异常");
}
//@ApplicationException(rollback=true)
public class MyException2 extends Exception { }
去掉//@ApplicationException(rollback=true)中的注释,则可以使用回滚了