EJB 企业级应用的架构(4)

来源:互联网 发布:网络文明创意广告 编辑:程序博客网 时间:2024/05/16 15:50




实体的状态






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();


            }


        }


    }
0 0
原创粉丝点击