我正在try 使用JpaRepository设置一个数据库表.我有以下模型类:

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

import lombok.Data;

@Data
@Entity
@Table
public class MyModel {
    @Id
    @GeneratedValue
    private final int id;
    private final String name;
    private final String imagePath;
}

当我运行应用程序时,表创建得很好.我已经手动向表中添加了一行,但是当我try 使用repository.findById查找该行时,我得到了以下错误:

org.hibernate.InstantiationException: No default constructor for entity:  : com.mypackage.mypackage.model.MyModel

我被"无默认构造函数"错误搞糊涂了.我以为@Data注释自动为类创建了构造函数?

推荐答案

Hibernates不处理不变的实体,它需要:

  • 空构造函数:public MyModel() {}
  • 接受者和接受者

所以只要go 掉final个修饰符,让@Data为你生成所有这些.


啊,这就是为什么它响了一个钟声,它与其他question of yours个有关.所以是的,对于Hibernate实体,你不能轻易地使用不可变的实体.如果您也需要这样的构造函数,您仍然可以在@Data旁边添加@AllArgsConstructor.


Edit:正如Andrey B. Panfilov在 comments 中正确提出的那样,@Data根本不应该用在实体之上.引用Thorben Janssen:

底线是,您可以在不 destruct 应用程序的情况下使用@Getter@Setter@Builder注释.唯一需要避免的龙目山注释是@Data@ToString@EqualsAndHashCode.

Java相关问答推荐

Spring安全实现多个SQL表身份验证

RDX触发ChoiceBox转换器(并按字符串值排序)

如何用javac编译Java类,即使对像java.lang.*这样的基本类也没有任何依赖关系?

在Java Stream上调用collect方法出现意外结果

RESTful框架类字段是安全的还是不安全的

JavaFX如何在MeshView中修复多个立方体?

如何获取Instant#of EpochSecond(?)的最大值

S,要对Java复制构造函数深度克隆所有属性进行单元测试,最可靠的方法是什么?

将PNG转换为位图自定义十六进制字符串

如何在 spring 数据的MongoDB派生查询方法中使用$EXISTS

虚拟线程应该很快消亡吗?

Spring安全令牌刷新和JWT签名与本地计算的签名不匹配

Android Java:已设置但未读取SharedPreferences

如何在不作为类出现的表上执行原生查询?

当我在Java中有一个Synchronized块来递增int时,必须声明一个变量Volatile吗?

具有多个模式的DateTimeForMatter的LocalDate.parse失败

JOOQ:批处理CRUD操作使用动态表定义,如何?

如何在单元测试中获得我的装饰Mapstruct映射器的实例?

message.acknowledge()没有';在使用Spring Boot在ActiveMQ中读取消息后,t将消息出列

移动二维数组的行