persistencecontext的简单介绍
为什么我看到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 名称)
: 表的生成策略
希望对你有帮助