繁体   English   中英

hibernate 使用@Data 注释创建的“没有实体的默认构造函数”

[英]hibernate "No default constructor for entity" created with @Data annotation

我正在尝试使用 JpaRepository 设置数据库表。 我有以下 model class:

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;
}

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

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

我对“无默认构造函数”错误感到困惑。 我以为@Data注释自动为 class 创建了一个构造函数?

Hibernates 不使用不可变实体,它想要:

  • 一个空构造函数: public MyModel() {}
  • getter 和 setter

因此,只需删除final修饰符,以便@Data为您生成所有这些。


啊,这就是它响铃的原因,它与你的另一个问题有关 所以,是的,使用 Hibernate 实体,你不能轻易使用不可变实体。 如果您也需要这样的构造函数,您仍然可以在@Data旁边添加@AllArgsConstructor


编辑:正如Andrey B. Panfilov在评论中正确提出的那样,@ @Data根本不应该在实体之上使用。 引用托本·詹森的话

底线是您可以使用@Getter@Setter@Builder批注而不会破坏您的应用程序。 您需要避免的唯一 Lombok 注释是@Data@ToString@EqualsAndHashCode

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM