【问题标题】:Spring boot Persistence Context annotationSpring Boot 持久化上下文注解
【发布时间】:2017-09-08 10:22:17
【问题描述】:

我是 Spring Boot 的新手,正在尝试在 Spring Boot 中创建一个基本的 REST 示例。我正在从Spring Boot REST example 网站获得帮助来创建一个基本示例。

大部分事情对我来说都很清楚,但我被一个注释所困扰,该注释用于从数据库中获取数据,代码如下

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 的实际工作原理 - 谁能解释一下?

【问题讨论】:

标签: java spring spring-boot spring-annotations


【解决方案1】:

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

  1. 实体由 javax.persistence.EntityManager 实例管理 使用持久化上下文。
  2. 每个 EntityManager 实例都与一个持久性相关联 上下文。
  3. 在持久性上下文中,实体实例及其 生命周期受到管理。
  4. 持久性上下文定义特定实体所处的范围 实例被创建、持久化和删除。
  5. 持久性上下文就像一个缓存,其中包含一组 持久实体,所以一旦事务完成,所有 持久对象与 EntityManager 的持久性分离 上下文,不再受管理。

【讨论】:

  • 您能否解释一下究竟什么是“实体实例”以及它与持久身份或持久对象有何不同?我对这一切都很陌生,我在网上找不到任何有用的文档。不过,您的回答是最有帮助的:)
  • @AsmaRahimAliJafri 实体是一个表关系。 instance 是一个用于该实体的对象。持久性对象是一个实体实例,您已使用 em.diffmethods() 设法通过实体管理器持久化它
  • 链接失效
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    @PersistenceContext 是 JPA 标准注释,它可以让您更好地控制要注入的持久性上下文。

    【讨论】:

      【解决方案4】:

      我的答案是在好几年之后才出现的,但这里是这样。

      此注解 @PersistentContext 与您的应用程序上下文中定义的另一个 bean 一起工作:

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

      两者协同工作的方式是PersistenceAnnotationBeanPostProcessor 将查找适当的 EntityManagerFactory 以注入实体管理器,其中我们有用@PersistenceContext 注释的属性

      我的理解是基于这个问题的答案:so question here

      【讨论】:

        【解决方案5】:

        简而言之,它是一个使用实体管理器管理实体的空间(只是说)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-06-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-02-19
          • 2020-07-09
          • 1970-01-01
          • 2017-12-15
          相关资源
          最近更新 更多