(12) ejb学习: JPA的传播属性
一 為什么需要傳播屬性
service調(diào)用圖
如上圖所示 , ?service2 可能被單獨調(diào)用,也有可能被service1調(diào)用 ,也有可能在其它service中調(diào)用, 因此不能使用?UserTransaction?utx方式將?
service2放入service1中 , 此刻就需要用到事務傳播了,假設用service1用了required,會在service1中會創(chuàng)建一個事務,并將該事務傳到service2中,
因此service1,service2都在同一個事務中了.
二 傳播屬性特性以及管理
?1 Not Supportd - 不支持,如果當前有事務上下文,將掛起當前的事務
?2 Support - 支持 , 如果有事務,將使用事務,如果沒有事務,將不使用事務.
?3 Required - 需要 , 如果當前有事務上下文,將使用當前的上下文的事務,
? ? ? ? ? 如果沒有,則創(chuàng)建新的事務
?4 Required New - 需要新的事務,如果當前有事務上下文,將掛起當前的事務,
? ? ?并創(chuàng)建新的事務去執(zhí)行任務,執(zhí)行完成之后,在恢復到原來的事務.
?5 Mandatory - 當前必須要有事務上下文,如果當前沒有事務,將拋出異常
?6 Nerver - 當前必須不能有事務上下文,如果有事務,將拋出異常.
三 ejb中使用傳播屬性示例
1 項目結(jié)構(gòu)
?
Student.java : 學生實體類
StudentManager.java 學生管理接口類
StudentManagerImpl.java 學生管理實現(xiàn)類
StudentManagerClient.java ?Junit測試類,
? ? ? ? ? ? ? ?測試1 :?testAddStudent1 ?沒有事務,增加學生失敗效果
? ? ? ? ? ? ???測試2 :?testAddStudent2?有事務,增加用戶成功
persistence.xml : 配置JTA的數(shù)據(jù)源
jndi.properties : 配置JNDI
client : 為JtaTest中testWithoutJta 和?testJta? 提供客戶端環(huán)境
? ? ? ? ? ? jar包有 : JBOSS_HOME/client/*.jar
2 代碼
Student.java
package leaning;import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id;@Entity public class Student {@Id@GeneratedValueprivate int id;private String name;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;}} StudentManager.java
package leaning;public interface StudentManager {public void addStudent(String name); }
StudentManagerImpl.java
package leaning;import javax.ejb.Remote; import javax.ejb.Stateless; import javax.ejb.TransactionAttribute; import javax.ejb.TransactionAttributeType; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext;/*** 事務傳播屬性為 Supports* **/ @Stateless(name="studentManager") @Remote @TransactionAttribute(TransactionAttributeType.SUPPORTS) public class StudentManagerImpl implements StudentManager {@PersistenceContext(unitName="propagation_unit")private EntityManager em;// persist 需要事務支持public void addStudent(String name) {Student s = new Student();s.setName(name);em.persist(s);}}
StudentManagerClient.java
package test;import static org.junit.Assert.*;import javax.naming.InitialContext; import javax.transaction.UserTransaction;import leaning.StudentManager;import org.junit.Test;public class StudentManagerClient {/*** 沒有事務,增加用戶失敗* */@Testpublic void testAddStudent1() {try{InitialContext context = new InitialContext();StudentManager studentManager = (StudentManager)context.lookup("studentManager/remote");// 服務器端使用了事務傳播特性為SUPPORTS即支持事務,如果沒有事務,將不使用事務// 現(xiàn)在客戶端沒有事務,但服務端執(zhí)行更新又必須要有事務支持,所以本次操作將拋出異常,無法執(zhí)行studentManager.addStudent("張三");}catch(Exception e){e.printStackTrace();}}/*** 有事務,增加用戶成功* */@Testpublic void testAddStudent2() {try{InitialContext context = new InitialContext();StudentManager studentManager = (StudentManager)context.lookup("studentManager/remote");//JTA事物管理接口UserTransaction utx = (UserTransaction)context.lookup("UserTransaction");try{utx.begin(); //開啟事物studentManager.addStudent("張三");utx.commit(); //提交事物}catch(Exception e){utx.rollback();e.printStackTrace();}}catch(Exception e){e.printStackTrace();}}} jndi.properties
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory java.naming.provider.url=localhost java.naming.factory.url.pkgs=org.jboss.naming\:org.jnp.interfaces
persistence.xml
<?xml version="1.0" encoding="UTF-8"?> <persistence xmlns="http://java.sun.com/xml/ns/persistence"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/persistencehttp://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0"><!-- 采集JTA事物 --><persistence-unit name="propagation_unit" transaction-type="JTA"><jta-data-source>java:/MySqlDS</jta-data-source><properties><property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" /><property name="hibernate.hbm2ddl.auto" value="update"/></properties></persistence-unit></persistence>
總結(jié)
以上是生活随笔為你收集整理的(12) ejb学习: JPA的传播属性的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (11) ejb学习: Jpa事务管理类
- 下一篇: (1) redis windows安装