实体的状态
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();
}
}
}