EJB-05:Entity 基础

一、Entity的概念

  1、什么是Entity?

  Entity是一个POJO,JPA(Java Persistence API)可以使用实体来持久化。

  2、JPA的特点

  ① JPA是一种标准的持久化机制

  ② 在容器内外均可以运行

  ③ 持久化提供者(Hibernate等)不影响JPA的使用

  3、Entity与Session Bean的区别

  (1) Session Bean用来建模业务流程,是一个动作;

  (2) Entity表示被持久化的数据,也可以认为是在内存中的Java对象的表示;

  (3) Entity生命周期很长,会话Bean表示业务逻辑,它的生命周期很短;

  (4) Session Bean是可被远程客户调用的,Entity不能被远程客户调用;

  (5) 实体不是EJB,Session Bean是EJB。

EJB3.0的JPA(Java持久化API)

 

O/R Mapping(对象关系映射)

TopLink,JDO,Hibernate

类型对应表,属性对应字段,关系对应引用

BO(商业对象,操作数据对象)

DO(数据对象)

持久化的数据对象,也就是已将对象信息同步到数据库中的对象,持久化对象也叫实体。

操作实体也就使操作实体在数据库中所对应的数据。

实体和SessionBean的区别

实体本身不支持远程访问,他的生命周期是比较长的。

实体有唯一性标识,也就对应数据库表中的主键。

注意:在实体中不要写商业方法

 

实体的唯一标识,可以使用标签@Id(标识属性可以使用public描述,也可以完全封装为其提供set,get方法),也可以使用XML文件来进行配置。

 

二、实体的编程

@Entity(name="Account"),实体类标注,其属性name是指定实体名,在EJB-QL中使用,默认是类的全名

@Id,指定实体的唯一标识属性,默认这个属性会合数据库中对应表的主键对应。

@GeneratedValue(strategy = GenerationType.AUTO)指定主键的生成策略。

@Colum(name="...",unique="true|false",nullable="true|false",insertable="true|false",

updateable="true|false",table="..."),指定类中属性对应的列名以及约束,

name属性指定类中属性对应的列名,默认为属性名

unique属性指定类中属性对应的列是否唯一,默认为false

nullable属性指定类中属性对应的列是否可空,默认为true

insertable="true|false"属性指定类中该属性是否会出现在insert语句中,也就是会不会被同步到数据库,默认为true,也就数会同步到数据库

updateable="true|false"属性指定类中该属性是否会出现在update语句中,也就是会不会被修改,默认为true可以被修改。

table属性指定类中属性的列所对应的表,默认为实体类所对应的表。

 

在使用实体同步到数据库时,SessionBean中要写EntityManager类型的属性,这个属性在Bean部署在容器中后,在运行时会容器依赖注入,如果没有容器也可以使用,但需要为其赋值。

EntityManager是一个接口,也就是规则,可以有不同的实现,Hibernate3.2就实现了这些JPA的接口。

  实体必须提供默认的构造方法,getter,setter方法。

  实体可以有业务方法,用于属性操作。

 

实体的状态

 

new新建,也就是新建的实体实例,其信息还没有持久到数据库中。

managed受管状态,也就是实体已经持久化到数据库中,并且已经和持久化上下文进行了关联。

detached分离状态,也就是与持久化上下文解除关联的实体的状态

removed删除,此时实体和持久化上下文进行了关联,但是要从数据库中删除这个实体。

 

 

  new persist()  中止PersistenceContext >

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

                     ||\   <  merge()

            remove()\|| persist()

                    删除

 

@PersistenceContext,持久化上下文是内存中的实例和数据库间的连接枢纽,就像是一快缓冲区,但这个缓冲区是由容器来进行管理的,在这个缓冲区中的实体是处在受管理状态。

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

type属性使用来标识持久化上下文的类型的,持久化上下文有两种类型事务范围和扩展的。这两种类型的持久化上下文的生命周期不同。unitName属性是指定持久化单元的名字,其值是在持久化单元定义文件中persistence-unit标签中的name属性的值。

  Psersistence Context(持久化上下文):

  持久化上下文表示一组实体,这些实体被Entity Manager所管理。

  两种Persistence Context:

  (1) 事务范围的持久化上下文,一般用于五状态的会话Bean。在默认情况下,EJB容器对每一个业务方法都会提供事务支持。

  (2) 可扩展的持久化上下文:用于有状态的Session Bean,当方法结束,持久化对象还会存在。

  可扩展的持久化上下文会在各个方法中共享。

  Extended Persistence Context:

  当方法调用结束是,persistence Context会继续存在。只有当EJB实例销毁是,才会删除。

  Extended Persistence Context可用在有状态的会话Bean中,用来缓存客户端的实体状态。

  @persistence Context→持久化单元信息注入

  type=PersistenceContextType.EXTENDED 可扩展的持久化上下文

  unitName=“firstejb”→持久化单元的名字

  Tips:持久化单元(配置文件persistence.xml)的作用:

  (1) 持久化提供者

  (2) 持久化单元的名字

  (3) 设置表的生成机制

关于Extended Persistence Context:

  (1) 在容器管理下,由实体管理器(EntityManager)创建

  (2) @persistence Context注入

    可以脱离容器运行,有EntityManagerFactory来创建。

 

事务范围的持久化上下文应用到无状态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<interface>

EntityManager实体管理器,它是用来管理实体的,如果使用容器管理实体,容器就会注入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

 

怎样操作EntityManager?

  由容器依照持久化的单元信息来创建,以及实体生命周期管理。并且,可以用@Persistence Context来注入到程序中。

 

EntityManager API:

  (1) Entity life-cycle management 实体生命周期管理

  (2) Database syschronization operations 数据库同步操作

  (3) Entity lookup and queries  实体查询

 

Entity life-cycle:

  ① new(暂态):实体没有纳入容器的管理,没有主键,数据库无记录

  ② managed(受管态/持久化状态):处于容器管理之下,有主键,数据库有记录

  ③ removed(删除状态):处于容器管理之下,此时可以通过persist()方法返回managed状态

  ④ detached(游离态):不处于容器管理下,数据库不确定是否有对应记录。

 

四、实体的回调

  回调是由持久化管理器来调用的,不是由EJB容器调用的。

  回调的作用是什么?

  在实体被JPA操作时,可以作预处理和后处理。

  回调方法可以定义在Entity内部,也可以定义在单独的监听器类中。如果定义在监听器里,回调方法必须带一个参数,即要监听的实体。

  @EntityListeners(XXXLister.class)监听器可以有多个,用{ ,,}表示。

 

五、实体的版本控制(锁机制)

(1) 在JPA中,我们可以使用乐观锁(Optimistic Locking),但必须是以下几种类型:

  int,Integer,short,Short,long,Long,Timestamp

(2) 采用@version来标注version字段,程序不用是对version字段进行任何操作,version字段值由容器来维护。

@NamedQuery(name=”findAll”,query=”select……”)静态查询语句,可以用标注。

多条语句

@NamedQueries({@NamedQuery(),@NamedQuery()} )

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值