当前位置: 首页 > 知识库问答 >
问题:

Spring数据JPA实体图不适用于Spring Boot

孔硕
2023-03-14

当应用程序基于Spring Boot时,不考虑定义的实体图。相反,在JUnit测试期间,一切正常。

领域非常简单:书籍及其类别(多对多关系)
图书类:

@Entity
@NamedEntityGraph(name = "Book.summary",
attributeNodes = { @NamedAttributeNode("book_id"), @NamedAttributeNode("title")})

public class Book {
@Id
@GeneratedValue(strategy= GenerationType.AUTO)
private Long book_id;

private String title;

@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = "BOOK_CATEGORY",
        joinColumns = @JoinColumn(name = "book_id", referencedColumnName = "book_id"),
        inverseJoinColumns = @JoinColumn(name = "category_id", referencedColumnName = "category_id"))
private List<Category> categories;

类别类:

@Entity
public class Category {
@Id
@GeneratedValue(strategy= GenerationType.AUTO)
private Long category_id;

private String name;

@ManyToMany(mappedBy = "categories")
private List<Book> books;

带有使用创建的实体图的方法的JPA存储库:

@Component
@Repository
public interface BookJpaRepository extends JpaRepository<Book, Long> {
@Override
@EntityGraph(value = "Book.summary", type = EntityGraph.EntityGraphType.FETCH)
List<Book> findAll(); }

REST控制器中的用法:

@RequestMapping("/books")
@ResponseBody
public List<Book> getBooksSummary() {
    return bookJpaRepository.findAll();
}

启动Spring Boot(mvn Spring Boot:run)并导航到http://localhost:8080/books书籍会被显示,但它们有各自的类别(由于无限递归,会引发异常:books)-

测试中的相同代码(使用SpringJUnit4ClassRunner运行)按预期工作,实体图被正确识别。例如,下面的代码没有显示类别,因为正如预期的那样,存在延迟初始化:

@Test
public void testEntityGraph() {
    List<Book> all = bookJpaRepository.findAll();

    System.out.println(all.get(0).getCategories());
}

应用程序在Spring Boot上运行时,如何让实体图工作,有什么建议吗?

共有1个答案

岳昊空
2023-03-14

正如Rae Burawes所指出的(谢谢!)在评论中,这种行为的原因是序列化
要处理Jackson serializer获取数据,我们可以使用以下注释:
-com。fasterxml。杰克逊。注释。JsonIdentityInfo-在类/字段
-com上。fasterxml。杰克逊。注释。JsonManagedReferencecom。fasterxml。杰克逊。注释。JsonIgnore-现场

更多信息可以在本教程中找到。

 类似资料:
  • 我将我的应用程序从spring boot 2.2.5升级到2.3.3,并且我正在使用spring data JPA starter和5.4.20.Final板载。我的实体在编译时得到了增强。 现在,当我使用注释与属性覆盖来自的方法时,我收到了这个警告: 即使这个警告-图是正确获取-我只能看到一个SQL查询日志和应用程序的行为之前的更新。 这是我的存储库代码: 这是我的实体: 如何解决此警告?我可以

  • 我用Spring和Hibernate开发了我的Java应用程序,我有两个实体。 我创建我的服务类别,以获得Hibernate的结果 当我调试时,我在这一行中得到这个错误: 104165[http-bio-8080-exec-3]警告组织。冬眠util。JDBCExceptionReporter-SQL错误:904,SQLState:42000 104166[http-bio-8080-exec-3

  • 我有一个实体: 而听众: 我正在使用为这个实体(1.4.1)和EclipseLink生成的Spring Data。代码行为如下所示: 这个问题在2009年已经有人描述过了,但是他们没有提出任何解决方案。不知道有没有人有办法解决?

  • 我在各自的字段中使用了@CreatedBy、@CreatedDate、@LastModifiedBy和@LastModifiedDate注释。通过使用@MappdSuperclass、@EntityListeners,我能够持久化上面的列。 但这不适用于以下情况: 审计员我mpl.java JpaAuditConfiguration。Java语言 在这种情况下,实体B填充了审计列。但实体A并非如此

  • 很难弄清楚我是在打虫子还是在做傻事... Spring Boot v2.0.0. M7,sping-data-jpa,sping-data-rest,MySQL 以下@Query 在一个上抛出一个 statusCode是一个varchar,本身作为@Entity按预期工作,但试图投影到字符串列表(或

  • 我目前正在使用带有Spring Data commons 1.9.1和Spring JPA 1.7.1的JpaSort。我需要使用QueryDSL,因为JPA不允许为空值定义排序。 这是我的存储库 我在我的控制器中这样做: 这就是我对JPA的看法: 这是我为QueryDSL更改的内容: 然而,似乎什么都没有得到整理。我已经启用了调试日志记录,我看到了这一点: 如果我将其更改为: 然后,按我的“数据