Spring Boot持久性上下文注解

9
我刚接触Spring Boot,正在尝试创建一个基本的Spring Boot REST示例。我正在参考Spring Boot REST示例网站来创建一个基本的示例。
大部分内容对我来说很清晰,但是我卡在了一条注解上,该注解用于通过以下代码从数据库中获取数据。
package com.springbootrest.repository;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.transaction.Transactional;

import org.springframework.stereotype.Repository;

import com.springbootrest.model.BookDetails;

@Transactional
@Repository
public class BookDetailsRepoImpl implements BookDetailsRepo {

 @PersistenceContext
 private EntityManager entityManager;

 public List<BookDetails> listBookDetails() {
 return (List<BookDetails>) entityManager.createQuery("FROM BookDetails").getResultList();
 }

}

我不理解@PersistenceContext的实际工作原理,可以有人解释一下吗?

以下文章可能会对您有所帮助: https://dzone.com/articles/how-annotations-work-java - maruf571
5个回答

11

@PersistenceContext - 我们需要了解如何使用简单的注释@PersistenceContext连接到数据库以及它是什么。

  1. 通过持久化上下文,javax.persistence.EntityManager实例管理实体。
  2. 每个EntityManager实例都与持久化上下文相关联。
  3. 在持久化上下文中,管理实体实例及其生命周期。
  4. 持久化上下文定义了一个范围,在该范围内创建、持久化和删除特定的实体实例。
  5. 持久化上下文类似于缓存,其中包含一组持久实体。因此,一旦事务完成,所有持久对象都将从EntityManager的持久化上下文中分离并不再受控制。

请问您能否解释一下什么是“实体实例”,它与持久标识或持久对象有何不同?我对这些都很陌生,也找不到任何有用的在线文档。不过,您的回答是迄今为止最有帮助的 :) - Asma Rahim Ali Jafri
@AsmaRahimAliJafri 实体是一个表关系。实例是一个将要用于该实体的对象。持久化对象是一个实体实例,您已经通过使用em.diffmethods()的实体管理器成功持久化了它。 - saravana kumar ramasamy
1
链接已损坏。 - Nakamoto

6

@PersistenceContext注解在您的代码中用于指示必须自动注入EntityManager,换句话说,其生命周期将由运行应用程序的容器(这是一个好事)进行管理。另一种选择是通过不同的选项提供所有所需的配置(应用程序管理),所有这些都很繁琐(配置文件或bean),并且存在将应用程序与某些特定环境配置绑定的风险(这是一件坏事)。


2

@PersistenceContext是JPA标准注解,它可以更好地控制你正在注入哪个持久化上下文。


1
我的回答来自多年的经验,以下是内容。

这个注解@PersistentContext与应用程序上下文中定义的另一个bean一起使用:

<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />

这两者的工作方式是 PersistenceAnnotationBeanPostProcessor 查找适当的 EntityManagerFactory,注入带有 @PersistenceContext 注释的属性中的实体管理器。

我的理解基于对这个问题的回答:在此处插入Stack Overflow链接


0
简单来说,这是一个空间(只是这么说),使用实体管理器来管理实体。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接