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();
}
}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.