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