EJB-トランザクション管理(2)に連れて行きます

3302 ワード

前の文章の中で私達はEJBの事物の管理に対して1つの全体の認識があって、同時にEJBの容器の事務の管理に対して1つの例を使って展示します.次に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管理トランザクションを使用するには、トランザクションのプロパティを明示的に設定する必要があります.管理トランザクションを独自にエンコードする必要があります.