persistencecontext的简单介绍

http://www.itjxue.com  2023-02-13 16:45  来源:未知  点击次数: 

为什么我看到spring可以注入抽象类的属性,比如用@PersistenceContext注入EntityManager的对象,用xml呢

关于这个问题,抽象类因为不能实例化,所以不能在spring的xml里配置bean,故不能作为属性注入其他bean。只能用抽象类的完全实现的子类注入。所以楼主不要纠结这个问题。 @PersistenceContext为什么又能实现EntityManager而引入jpa呢? 这是因为spring遇到注解@PersistenceContext后,从容器中得到一个EntityManager对象,但这个对象其实是它子类的对象,而且已经初始化了,不是EntityManager自身的。所有的对象spring都能管理,so,得到一个子类对象很好理解吧

JAVAEE容器怎么管理EntityManager和PersistenceContext

容器托管EntityManager

@PersistenceContext,存放unitName指向的DataBase对应的EntityBean实例集合,以及对这些实例进行生命周期管理

@PersistenceContext(

name="entityManagerName",

properties=@PersistenceProperty[],

type=""//PersistenceContextType TRANSACTION (default,transaction-scope)/EXTENDED

unitName=""//the persistence unit name

)

EntityManager

必须关联一个PersistenceContext对象,提供一系列方法对PersistenceContext中的EntityBean实例进行操作。

可以使用依赖注入,将某个PersistenceContext对象注入给EntityManager对象

如:

@PersistenceContext(unitName="lxhPU")

private EntityManager entityManager;

JAVAEE容器会智能选取容器中的PersistenceContext实例跟这个entityManager实例来关联

a、一般情况下,一个persistence unit只需对应一个PersistenceContext实例,如

class UserDao{ @PersistenceContext(unitName="lxhPU") private EntityManager entityManager; } class OrderDao{ @PersistenceContext(unitName="lxhPU") private EntityManager entityManager; }

UserDao和OrderDao中的entityManager对象关联的PersistenceContext是同一个实例

当然,我们也可以手动为PersistenceUnit增加PersistenceContext实例

class UserDao{ @PersistenceContext(unitName="lxhPU") private EntityManager entityManager; @PersistenceContext(name="pc2" ,unitName="lxhPU") private EntityManager entityManager2; }

UserDao 中的entityManager和entityManager2关联的2个PersistenceContext实例是不同的,尽管他们指向的是同一个PersistenceUnit

b、JAVAEE容器会维护PersistenceContext实例及其关联的EntityManger实例

一个PersistenceContext实例可以被多个EntityManager实例关联

class UserDao{ @PersistenceContext(unitName="lxhPU") private EntityManager entityManager; @PersistenceContext(unitName="lxhPU") private EntityManager entityManager2; } class OrderDao{ @PersistenceContext(unitName="lxhPU") private EntityManager entityManager; }

往DAO类中注入@PersistenceContext和@Resource的区别

@PersistenceContext

private EntityManager em;

注入的是实体管理器,执行持久化操作的,需要配置文件persistence.xml。

注入一堆保存实体类状态的数据结构,针对实体类的不同状态(四种,managedh或detached等)可以做出不同的反应(merge,persist等等),其实就是把数据从数据库里提出,然后在内存里处理的,再返回数据库的法则。

@Resource

是注入容器提供的资源对象,比如SessionContext MessageDrivenContext。或者你那个name指定的JNDI对象

可以理解为资源-数据源-也就是数据连接,基本上就是告诉程序数据库在哪里

如何获得EntityManager

关于如何获得EntityManager:

在容器内部使用,使用@PersistenceContext 来注入.

@PersistenceContext

private EntityManager em;

TAG

=======================================================

注入:

让容器来负责构建一个实体管理器,并且将该实体管理器注入到Bean 中.

=======================================================

2.在容器外部使用

Persistence 构造一个EntityManagerFactory , 然后再构造EntityManager.

Code:

EntityManagerFactory emf = Persistence.createEntityManagerFactory();

EntityManager em = emf.createEntityManager();

写persistence.xml

持久化单元名,在一个persistence.xml 中可以有多个持久化单元,用名字来区分.

如果只有一个就可以省略不写.

: 告诉容器持久化提供者是哪一个

: 数据源的位置(JNDI 名称)

: 表的生成策略

希望对你有帮助

(责任编辑:IT教学网)

更多

推荐Fireworks教程文章