如果实体中没有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。实体框架 [重复]