往DAO類中註入@PersistenceContext和@Resource的區別詳解
DAO類註入@PersistenceContext和@Resource區別
@PersistenceContext
private EntityManager em;
註入的是實體管理器,執行持久化操作的,需要配置文件persistence.xml。
註入一堆保存實體類狀態的數據結構,針對實體類的不同狀態(四種,managedh或detached等)可以做出不同的反應(merge,persist等等),其實就是把數據從數據庫裡提出,然後在內存裡處理的,再返回數據庫的法則。
@Resource
是註入容器提供的資源對象,比如SessionContext MessageDrivenContext。或者你那個name指定的JNDI對象
可以理解為資源->數據源->也就是數據連接,基本上就是告訴程序數據庫在哪裡
JPA中為什麼EntityManager的註解要用@PersistenceContext
在使用SpringJPA的時候,看到如下代碼
@PersistenceContext private EntityManager entityManager;
於是就有些好奇,這個@PersistenceContext是幾個意思,如果是實體註入的話,統一采用
@Autowired可以嗎?於是上網查瞭下,幾乎所有的EntityManager都是采用這個註解的,就去找瞭找原因。
根據上面的描述,總結如下
- @PersistenceContext是jpa專有的註解,而@Autowired是spring自帶的註釋
- EntityManager不是線程安全的,當多個請求進來的時候,spring會創建多個線程,@PersistenceContext就是用來為每個線程創建一個EntityManager的,而@Autowired隻創建瞭一個,為所有線程共用,有可能報錯
- 在使用EntityManager的時,請采用@PersistenceContext進行註解,而不要使用@Autowired
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- 新建springboot項目時,entityManagerFactory報錯的解決
- 解決persistence.xml配置文件修改存放路徑的問題
- 一文搞懂Spring中@Autowired和@Resource的區別
- Spring中@Autowired與@Resource的區別詳析
- Java之jpa入門教程講解