【问题标题】:Project Lombok + Hibernate No Default Constructor for EntityProject Lombok + Hibernate 没有实体的默认构造函数
【发布时间】:2020-03-11 18:53:35
【问题描述】:

我有一个如下所示的 Employer 类:

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;

@NoArgsConstructor
@AllArgsConstructor
@Data
@Entity
public class Employer {

  private @Id @GeneratedValue(strategy = GenerationType.IDENTITY) Long id;

  @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "employer")
  private List<Offer> offerList = new ArrayList<>();

  private String name;
  private String location;
  private String description;
  private int companySize;

  public Employer(String name, String location, String description) {
    this.name = name;
    this.location = location;
    this.description = description;
  }
}

在 localhost:8080/employers 上发送 GET 请求会得到我:

ERROR 6154 --- [nio-8080-exec-7] o.a.c.c.C.[.[.[/].[dispatcherServlet: Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.orm.jpa.JpaSystemException: No default constructor for entity:  : com.krdkta.internship_for_you.model.Employer; nested exception is org.hibernate.InstantiationException: No default constructor for entity:  : com.krdkta.internship_for_you.model.Employer] with root cause

即使显然有一个 Lombok Annotation 定义了这个无参数构造函数,但我仍然得到这个错误。将 Lombok 与 Hibernate 一起使用是否有任何禁忌症:)?

【问题讨论】:

  • 这不是很奇怪。要回答您的问题,不,将 Lombok 与 Hibernate 一起使用没有任何禁忌症,我在我的所有实体上都使用它,其中一些完全按照您在此处使用它们的方式进行了定义。由于它显然没有按您期望的方式工作,我将首先编写一个测试来简单地验证无参数构造函数是否存在。如果没有,那么您可能需要将 lombok 注释处理器添加到您的 pom 中(假设您使用的是 maven)。
  • 你确定 Lombok 真的在运行吗?它可能需要一些设置,包括安装 IDE 插件。
  • 显然解决方案是从终端运行:mvn clean 然后 mvn spring-boot:run,但我真的不知道为什么。
  • 如果您使用 Gradle,请在此处考虑我的回答:stackoverflow.com/questions/55304021/…

标签: java spring hibernate spring-boot lombok


【解决方案1】:

Lombok 在编译期间被调用(从技术上讲,它和注释处理器)。 而 Hibernate 在运行时的使用要晚得多。

事实上,从任何运行时框架的角度来看,使用 lombok 生成的无参数构造函数和“手动”创建的无参数构造函数之间没有区别。

所以直接回答你的问题:不,没有矛盾。

现在,我相信您使用了类似 maven 的东西,其中您已将 lombok 添加为依赖项,并且在 Maven 编译您的类的情况下它应该足够了。但是,如果您将 lombok 与 IDE 一起使用(例如,从您的 ide 中运行主类),您可能需要执行其他步骤:

例如,在 IntelliJ 中,您应该转到 Settings -&gt; Compiler -&gt; Annotation Processors 并启用注释后处理。这个问题已经问过here,所以我没有太多要补充的。

安装lombok插件也不错。它具有“delombok”集成,因此您可以直接在 IDE 中查看 lombok 生成的确切内容。

【讨论】:

  • 启用注释处理没有产生任何效果:/ 我确实在 Intellij Idea 中安装了 lombok 作为插件。它也作为依赖项包含在 pom.xml 中。此外,Lombok 是通过 Global Libraries 添加的
  • 如果您设置了 intellij,请使用 delombok(在 UI 中可用)并确保确实生成了无参数公共构造函数
【解决方案2】:

您能像这样更改注释的顺序吗?


@Builder
@Data
@Entity
@EqualsAndHashCode
@AllArgsConstructor
@NoArgsConstructor
public class Employer {

【讨论】:

  • 注释的顺序无关紧要。另外他没有使用@Builder注解。
【解决方案3】:

你可以使用它。这适用于我的项目。

@Entity
@Table
@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Employer {}

【讨论】:

    猜你喜欢
    • 2015-03-19
    • 1970-01-01
    • 2017-10-20
    • 2018-01-10
    • 1970-01-01
    • 2020-02-07
    • 2014-10-16
    • 2016-03-18
    相关资源
    最近更新 更多