如果实体中没有getter和setter,为啥hibernate不会抛出异常

Posted

技术标签:

【中文标题】如果实体中没有getter和setter,为啥hibernate不会抛出异常【英文标题】:Why hibernate doesn't throw exception if there is no getter & setter in entity如果实体中没有getter和setter,为什么hibernate不会抛出异常 【发布时间】:2018-09-14 22:38:20 【问题描述】:

我有 1 个没有 getter 和 setter 的实体类。

我在数据库中有 4 条记录。当我尝试创建 rest 服务并从 db 查询这些数据时,hibernate 返回 4 个空元素。

[,,,,]

Hibernate 尝试将记录设置到实体中,但由于没有 setter 方法而失败。

那么为什么hibernate不会抛出像“没有setter,设置失败......”这样的异常,它正在尝试设置并返回空列表。

告诉我原因,这是一个错误还是它在我不知道的不同日志路径中返回错误?

编辑:这里是 Entity.class

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "entry_table", schema = "public")
public class Entry 

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "ENTRY_ID")
    private Long entryId;

    @Column(name = "USER_NAME")
    private String userName;

    @Column(name = "USER_ENTRY")
    private String userEntry;

    public Entry(Long entryId, String userName, String userEntry) 
        this.entryId = entryId;
        this.userName = userName;
        this.userEntry = userEntry;
    

    public Entry() 

    

【问题讨论】:

Hibernate tries to set records into entity but fails because there is no setter method. 你怎么知道 hibernate 正在尝试设置值但由于缺少设置器而导致 bcos 失败?实例变量是可访问的还是私有的? 这是 [,,,,] 来自 REST api 的响应还是您检查了 DAO 层? 实体类的实例变量是否可以从外部访问?为了在数据库中保存一个新的实体实例,你是如何填充这些实例变量的? 你能发布你的实体类吗? @MadhusudanaReddySunnapu 因为它返回空列表。 【参考方案1】:

空的 rest 响应是由于 JSON 序列化未在实体中找到访问器。您至少需要getters 才能使 JSON 序列化工作并显示正确的响应。

Hibernate 正确地填充实体并将它们发送到您的 REST 层。

【讨论】:

【参考方案2】:

简单的答案是它不是 BUG。

正如您从文档 Declare getters and setters for persistent attributes 中看到的那样

标准的、可移植的 JPA 本质上需要这个。否则你的模型 将违反上述关于访问 直接来自实体外部的实体持久状态字段 自己。

虽然Hibernate不需要,但还是建议遵循 通过为实体定义 getter 和 setter 来实现 JavaBean 约定 持久属性。您仍然可以告诉 Hibernate 直接访问 实体的字段。

您得到的是空元素,因为您可能不会将实体类的任何字段暴露给外界。所以这很正常。

来自Access strategies 文档

使用基于字段的访问的好处是一些实体属性 可以从实体外部隐藏。这种属性的一个例子是 实体@Version 字段,不能被数据操作 接入层。使用基于字段的访问,我们可以简单地省略 getter 和这个版本字段的设置器,Hibernate 仍然可以 利用乐观并发控制机制。

【讨论】:

以上是关于如果实体中没有getter和setter,为啥hibernate不会抛出异常的主要内容,如果未能解决你的问题,请参考以下文章

为啥 GSON 使用字段而不是 getter/setter?

为啥 getter/setter 在 vue typescript 类组件中无法正常工作

在使用 JPA 映射类时,为啥有人要在 getter 或 setter 上添加注释?

该属性必须是有效的实体类型,并且该属性应该具有非抽象的 getter 和 setter。实体框架 [重复]

为啥我不能将自动实现的 getter 和 setter 与 List 一起使用? (统一,C#)

为啥 Swift 不像 Java 或 C# 那样对属性使用 getter 和 setter?