@Autowired vs @PersistenceContext for EntityManager bean

Cos*_*sii 46 spring jpa entitymanager

有什么区别:

@Autowired
private EntityManager em;
Run Code Online (Sandbox Code Playgroud)

与:

@PersistenceContext
private EntityManager em;
Run Code Online (Sandbox Code Playgroud)

这两个选项都适用于我的应用程序,但是我可以通过使用 @Autowired注释来解决问题吗?

Ale*_*lex 32

你不应该使用@Autowired. @PersistenceContext注意为每个线程创建一个唯一的 EntityManager。在生产应用程序中,您可以让多个客户端同时调用您的应用程序。对于每次调用,应用程序都会创建一个线程。每个线程都应该使用自己的 EntityManager。想象一下,如果他们共享同一个 EntityManager 会发生什么:不同的用户将访问相同的实体。

usually the EntityManager or Session are bound to the thread (implemented as a ThreadLocal variable).
Run Code Online (Sandbox Code Playgroud)

来源:https : //stackoverflow.com/a/42074452/2623162

EntityManager instances are not thread-safe. 
Run Code Online (Sandbox Code Playgroud)

来源:https : //docs.oracle.com/cd/E19798-01/821-1841/bnbqy/index.html

请注意,@PersistenceContext注解来自javax.persistence包,而不是来自 spring 框架。在 JavaEE 中,它被 JavaEE 容器(也称为应用服务器)用来注入 EntityManager。Spring 借用 PersistenceContext 注释来做同样的事情:为每个线程注入一个应用程序管理的(= 不是容器管理的)EntityManager bean,就像 JavaEE 容器所做的那样。

  • 在 Spring 的上下文中,我认为这个答案是不正确的。根据文档,线程安全不是问题(请参阅此问题的答案/sf/answers/5222824491/)。差异在于如何引用不同的实体管理器(当使用多个数据源时),即@PersistentContext(name = "emBeanName") 或@Qualifier("emBeanName")@Autowired。据我所知,Spring 通常会注入一个代理来处理线程问题。 (3认同)

sas*_*_bg 23

@PersistenceContext允许您指定要使用的持久性单元.您的项目可能有多个数据源连接到不同的数据源,并@PersistenceContext允许您说出您要操作的数据源

请查看此处的说明:http: //www.coderanch.com/t/481448/java-EJB-SCBCD/certification/unitName-PersistenceContext


Mag*_*GGG 14

@PersistenceContext:

返回实体管理器实例

它返回容器管理的代理,代表应用程序代码获取和释放存储上下文


Ale*_*lex 13

@PersistenceContext是为特定目的而设计的JPA标准注释.而@Autowired在Spring中用于任何依赖注入.使用@PersistenceContext可以更好地控制上下文,因为它使您能够指定可选元素,例如名称,属性

  • 我认为通常最好使用`@ PersistenceContext`,因为它更接近地描述了你想要实现的依赖注入的类型.此外,它还提供了专门用于EntityManager的可选参数,当您有多个EntityManager时,这可能很有用.在功能上我相信你可以使用`@Autowired`实现相同的注入,但我会建议使用这样设计的注释. (3认同)