EntityManager:seam新手必读(一)

时间:2021-07-28 20:02:01

    开始学习seam的时候,有两个问题:我会用Spring和Hibernate,但一点也不懂Seam 和EJB3的 EntityManager。我用了一些时间学习seam,但EntityManager 一直困扰我。
    同时我也有了一些小收获,愿意跟刚刚开始学习seam的朋友分享以下。别紧张,我不敢确信我写的东西都正确 ;).
    好了,关于EntityManager有何用处?它管理你的entities ;)。 那是一些简单的java对象,通过getters and setters具备一些属性。这些属性之一是id(一般是Long数据类型),并且这些class必须以@Entity注解(annotated )。在seam的源码中可以找到一大批这样的例子,例如booking例子。在seam中,一件很重要的事情就是,每个Entity都有一个 @Name 注解(annotation),这样,它们才能被注入到其他seam部件(component)中。
    假设我们有这样一个entity class,叫做"Entity"。其生命周期内包含以下功能:

EntityManager 提供了这些功能。首先,如何把EntityManager 引入我的代码?很简单:

EntityManager:seam新手必读(一)@PersistenceContext
EntityManager:seam新手必读(一)
private EntityManager em;    

    好了,我们看看一个Entity 进程如何产生:

EntityManager:seam新手必读(一)Entity entity = new Entity();    

    这很简单。现在,这entity 的状态是NEW/TRANSIENT 。这意味着一个entity已经存在于你的应用程序中,但并不具有id,也不存在于你的数据库中。

    由于我们要使它持久化(即它应被写入数据库),我们应把它的状态转换为MANAGED

EntityManager:seam新手必读(一)em.persist(entity);    

    现在,此entity由EntityManager管理了。EntityManager控制entity写入数据库。这动作无须立刻发生,可能把你的entity放在cache,稍后写入数据库。你可以放心,写动作肯定会发生。

Ok, what about reading an existing entity from the database? Therefore we use:

好,如何从数据库中读出已存在的entity呢?这样:

EntityManager:seam新手必读(一)Entity entity = em.find(Entity.class, Id);    

    每个entity 有一个id(我已经说过,多数情况下是Long数据类型),通过id你可存取entity。这是这里的第二个参数。第一个参数代表你要存取的Entity class的进程。find操作之后,entity的状态也是MANAGED

(待续)