EJB 企業級應用的架構(4)





實體的狀態






new新建,也就是新建的實體實例,其信息還沒有持久到數據庫中。


managed受管狀態,也就是實體已經持久化到數據庫中,並且已經和持久化上下文進行了關聯。


detached分離狀態,也就是與持久化上下文解除關聯的實體的狀態


removed刪除,此時實體和持久化上下文進行了關聯,但是要從數據庫中刪除這個實體。










  new      persist()    中止PersistenceContext >


  ——>新建————>受管========================分離


                     ||\   <  merge()


            remove()\|| persist()


                    刪除










@PersistenceContext,持久化上下文是內存中的實例和數據庫間的連接樞紐,就像是一快緩衝區,但這個緩衝區是由容器來進行管理的,在這個緩衝區中的實體是處在受管理狀態。






@PersistenceContext(type=PersistenceContextType.EXTENDED,unitName="PetPU")


type屬性使用來標識持久化上下文的類型的,持久化上下文有兩種類型事務範圍和擴展的。這兩種類型的持久化上下文的生命週期不同。unitName屬性是指定持久化單元的名字,其值是在持久化單元定義文件中persistence-unit標籤中的name屬性的值。






事務範圍的持久化上下文應用到無狀態SessionBean,一旦事務終結,就銷燬,其中的實體也會變成分離狀態。


擴展的持久化上下文應用在有狀態的SessionBean,只有在有狀態的SessionBean被容器銷燬是纔會銷燬持久化上下文,也就使實體一直是被管理的。






持久化單元的定義文件,這個文件是描述數據庫連接和事務管理的文件






<persistence version="1.0" 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/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">


  <persistence-unit name="PetPU" transaction-type="JTA">


    <!--transaction-type是事務管理的類型-->


    <provider>oracle.toplink.essentials.ejb.cmp3.EntityManagerFactoryProvider</provider>


    <!--SPI,持久化API的實現類的提供者-->


    <jta-data-source>my.jdbc</jta-data-source>


     <!--數據源的配置-->


    <properties>


      <property name="toplink.ddl-generation" value="create-tables"/>


    </properties>


  </persistence-unit>


</persistence>






EntityManager實體管理器,它是用來管理實體的,如果使用容器管理實體,容器就會注入EntityManager,EntityManager可以提供實體類生命週期管理,實現數據的同步,和實體的數據的查詢。






實體生命週期回調方法






實體的生命週期回調方法不是通用的。


在實體類中定義時,只在方法前加標註,並且方法的返回值爲void,方法爲public


也就是:






@PrePersist


public void save(){}


在另外的類中寫生命週期回調方法時,就需要以這個實體類爲參數了


class AcountListenter{


@PrePersist


public void save(Acount a){}


}






@Entity


@EntityListenters(AcountListenter.class)


class Acount...






PostPersist


PreRemove


PostRemove


PreUpdate


PostUpdate


PostLoad










MessageDriverBeanS(MDB 消息驅動Bean)






消息驅動Bean,可以實現異步編程,也就是發送消息,而不必等待返回確認,也就像發郵件一樣,只是發出,而阻塞不必等待迴應。






消息驅動Bean是在接受到消息之後再通過onMessage方法進行消息的處理,也就是消息的消費者,消息驅動Bean也是無狀態的。






    public void onMessage(Message message)  {


        if(message instanceof TextMessage){


            TextMessage tm=(TextMessage)message;


            String s = null;


            try {


                s = tm.getText();


            } catch (JMSException ex) {


                ex.printStackTrace();


            }


            try {


                tm.setText("reserve"+s);


            } catch (JMSException ex) {


                ex.printStackTrace();


            }


        }


    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章