在上一篇文章中我们对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接口的begincommitrollback方法来确定事务界限,该接口只能在SessionBean中使用,实体Bean不允许使用用户自定义的。上面的例子示范了UserTransaction的用法。begincommit方法确定了数据库操作的事务界限,如果操作失败则调用rollback回滚事务并抛出EJBException异常。

         容器管理事务不支持嵌套事务,Bean管理事务支持嵌套事务,所以需要嵌套事务时可以采用Bean管理事务,使用Bean管理事务需要我们显式的设置事务的属性,需要我们自己编码管理事务.


 
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐