在上一篇文章中我们对EJB的事物管理有了一个整体的认识,同时对EJB的容器事务管理用了一个例子进行展示.接下来是EJB的另一种管理事务的方式Bean管理.也用一个例子来进行展示和说明.
Bean本身来管理事务
建立实体类
package com.tgb.jpa;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name="T_Student")
public class Student {
@Id
@GeneratedValue
private int id ;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
private String name;
}
建立接口
package com.tgb.jpa;
public interface StudentManager {
public void addStudent(String name);
}
建立EJB,此处需要注意的一些是增加注解:
@TransactionManagement(TransactionManagementType.BEAN)表示本EJB的事务管理方式是通过Bean的方式来进行自身的管理,脱离了容器的管理,需要在Bean内自己进行事务的管理.如下:
package com.tgb.jpa;
import javax.annotation.Resource;
import javax.ejb.Remote;
import javax.ejb.Stateless;
import javax.ejb.TransactionManagement;
import javax.ejb.TransactionManagementType;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.transaction.UserTransaction;
@Stateless(name = "StudentManager")
@Remote
@TransactionManagement(TransactionManagementType.BEAN)
public class StudentManagerBean implements StudentManager {
@PersistenceContext
private EntityManager em;
@Resource
private UserTransaction ut;
@Override
public void addStudent(String name) {
try {
ut.begin();
Student s = new Student();
s.setName(name);
em.persist(s);
System.out.println("服务器端执行成功:保存姓名"+name);
ut.commit();
} catch (Exception e) {
try {
e.printStackTrace();
ut.rollback();
} catch (Exception e1) {
e1.printStackTrace();
}
}
}
}
建立客户端进行测试EJB,增加Jndi.properties文件;
package com.tgb.jpa;
import javax.naming.InitialContext;
import javax.naming.NamingException;
public class StudentManagerClient {
/**
* @param args
* @throws NamingException
*/
public static void main(String[] args) throws NamingException {
InitialContext context = new InitialContext();
StudentManager sm =(StudentManager) context.lookup("StudentManager/remote");
sm.addStudent("jiqing");
System.out.println("客户端执行成功");
}
}
小结:
用Bean管理事物我们需要要自己确定事务界限,可以调用javax.transaction.UserTransaction接口的begin、commit和rollback方法来确定事务界限,该接口只能在SessionBean中使用,实体Bean不允许使用用户自定义的。上面的例子示范了UserTransaction的用法。begin和commit方法确定了数据库操作的事务界限,如果操作失败则调用rollback回滚事务并抛出EJBException异常。
容器管理事务不支持嵌套事务,Bean管理事务支持嵌套事务,所以需要嵌套事务时可以采用Bean管理事务,使用Bean管理事务需要我们显式的设置事务的属性,需要我们自己编码管理事务.