缺少具有嵌入 ID 的实体的默认构造函数



当我尝试从 JPA 存储库获取实体列表时,总是出现这样的异常

org.springframework.orm.jpa.JpaSystemException: No default constructor for entity:  : pl.hycom.hyper.hyebok.model.ServiceEntity$Id; nested exception is org.hibernate.InstantiationException: No default constructor for entity:  : pl.hycom.hyper.hyebok.model.ServiceEntity$Id

我的实体中缺少什么。我在可嵌入类和外部类中都有非 args 构造函数和全 args 构造函数。我找不到这个问题的解决方案。

我的实体在下面

@Entity
@Table(name = "he_service")
public class ServiceEntity implements Serializable {
    @EmbeddedId
    private Id id ;
    private String name;
    public ServiceEntity() {
    }
    public ServiceEntity(Id id, String name) {
        this.id = id;
        this.name = name;
    }
    @Embeddable
    class Id implements Serializable {
        public Id() {
        }
        public Id(String serviceId, String clientId) {
            this.serviceId = serviceId;
            this.clientId = clientId;
        }
        @Column(name = "serviceId")
        private String serviceId;
        @Column(name = "clientId")
        private String clientId;
        public String getServiceId() {
            return serviceId;
        }
        public void setServiceId(String serviceId) {
            this.serviceId = serviceId;
        }
        public String getClientId() {
            return clientId;
        }
        public void setClientId(String clientId) {
            this.clientId = clientId;
        }

   }

那里的存储库方法

   @Query(value= "SELECT s FROM ServiceEntity s " +
            "WHERE s.id.clientId = :clientId")
    List<ServiceEntity> findByClientId(@Param("clientId") String clientId);

您的内部Id类是非静态的,这意味着它创建了一个构造函数

class Id implements Serializable {
    public Id(ServiceEntity arg0) {
    }
    // …
}

将其更改为static

static class Id implements Serializable {
    // …
}

Id类设为静态。否则,它将需要一个 ServiceEntity 实例来实例化。

如果需要

保存在不同的包中,您还可以在其自己的Id.java文件中声明Id,例如class ID { }public class ID { }

一般相关信息:如何解决"需要包含 X.Y 的封闭实例"?

也许问题是Spring在这方面失败了

需要包含 ServiceEntity.ID 的封闭实例

我是

Java的新手,一直在全栈Java和Angular应用程序中进行探索。

创建了一个服务,允许我执行 CRUD 操作并将数据存储在内存数据库中。

我试图用http://localhost:8080/users/Joe/all-todos显示我的数据 我得到OP提出的错误。

为了解决我的问题,我必须创建一个默认构造函数,如下所示: // JPA expects a default constructor in my entity class ToDo protected ToDo() {}

请注意,我使用的是 JPA。 我只是将该默认构造函数添加到我的实体类并运行我的 java 应用程序,它就会呈现数据。

希望这在某种程度上有助于错误消息。

最新更新