【问题标题】:Avoid Lazy properties fetched in ResponseEntity避免在 ResponseEntity 中获取惰性属性
【发布时间】:2019-01-31 11:20:35
【问题描述】:

我是 Spring、Hibernate、JPA 和它的 API 的新手。我创建了一个@RestController,相关的方法是这样的,

@GetMapping("/user")
    public ResponseEntity getListItemById(){
        UserTypeEntity entity = userTypeRepository.findFirstByUserTypeId(1);    
        return ResponseEntity.ok().body(entity);    
    }

UserTypeEntity 有 2 个惰性吸气剂,

@ManyToOne(fetch = FetchType.LAZY, optional = false)
    @JoinColumn(name = "user_id", referencedColumnName = "user_id", nullable = false)
    public UserEntity getUserByUserId() {
        return userByUserId;
    }

    @ManyToOne(fetch = FetchType.LAZY, optional = false)
    @JoinColumn(name = "user_type_list_item_id", referencedColumnName = "list_item_id", nullable = false)
    public ListItemEntity getListItemByUserTypeListItemId() {
        return listItemByUserTypeListItemId;
    }

ListItemEntityUserEntity 的所有属性都是 null,除非我使用 JOIN FETCH 查询。我已经检查并验证了那个。 (任何有经验的人都可能熟悉) 看起来像以下。

这是我用来获取的示例响应,

(抱歉,由于数据响应大,甚至无法格式化,虽然我在每个表中只有一行。这是无限递归(StackOverflowError))

一切最终都会被加载。我无法确定这里到底出了什么问题。为什么这些惰性空属性被加载,我得到了这个奇怪而模糊的响应?我已经浪费了一整天的时间,请帮助摆脱这个。

【问题讨论】:

  • 有什么问题? (我在该图像中看不到任何空值)
  • 抱歉,由于数据响应大,它甚至无法格式化,尽管我在每个表中都有单行。似乎大量重复 是的,它可以。 JSON 的内部部分仍然是有效的 JSON,因此只需剪切相关部分并格式化即可。
  • 目前还不清楚您的问题到底是什么。
  • @Antoniossss 这是问题所在。ListItemEntityUserEntity 的所有属性都是空的。但是作为响应,这些属性被加载并返回:(
  • 再次,我在这里看不到空值。您会看到它们的响应,因为它们是延迟加载的。我只假设您的意思是“字段”是空值 - 为什么不是?你没有初始化那些。

标签: spring hibernate rest jpa


【解决方案1】:

将您的注释从 getter 移动到字段声明,您将看到一致的结果。

编辑后: @ShreeKrishna 那是我的观点。现在我可以清楚地解释这是预期的行为。调试器向您显示实际是哪些字段,哪些字段是并且将为空,因为您的惰性初始化触发器在 GETTER 方法上,而不是在字段上。因此,只要您将通过 getter 而不是直接访问来访问您的属性,就不要关注调试器向您显示的内容 - 您会没事的。

【讨论】:

  • 这些都是从现有数据库和模式中生成的实体。我在它的关系中遇到了太多麻烦,并且已经不得不修改很多以使其变得懒惰并避免崩溃......让我试试这个
  • 为什么这种持久性会生成这样的注释? :(你有什么想法兄弟..生成后很难修改所有内容,因为数据库模式经常更改。
  • 如果我将此注释从 getter 移动到字段,则会显示编译错误 org.hibernate.MappingException: Could not determine type for: ListItemEntity, at table: user_type, for columns
猜你喜欢
  • 2021-02-08
  • 2011-08-18
  • 1970-01-01
  • 1970-01-01
  • 2014-11-21
  • 2012-12-11
  • 1970-01-01
  • 1970-01-01
  • 2014-03-09
相关资源
最近更新 更多