缺少具有EmbeddedId的实体的默认构造函数

时间:2017-10-24 12:43:45

标签: java hibernate jpa spring-data

总是当我尝试从JPA Repository获取实体列表时,我得到了像这样的例外

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

我的实体缺少什么。我在Embeddable类和外部类中都有非args构造函数和all-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);

4 个答案:

答案 0 :(得分:7)

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

class Id implements Serializable {

    public Id(ServiceEntity arg0) {
    }
    // …
}

将其更改为static班级

static class Id implements Serializable {
    // …
}

答案 1 :(得分:2)

使Id类保持静态。否则,它将需要ServiceEntity的实例来实例化。

答案 2 :(得分:0)

如果需要保留在不同的套餐中,您也可以在Id文件中声明Id.java,如class ID { }public class ID { }

一般相关信息:How can I resolve “an enclosing instance that contains X.Y is required”?

问题可能是Spring在此

上失败了
  

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

答案 3 :(得分:0)

我是Java的新手,并且一直在进行全栈Java和angular应用程序的探索。

我创建了一项服务,该服务可以执行CRUD操作并将数据存储在内存数据库中。

我试图在CellPtr last_cell_out(CellPtr *listPtr) { CellPtr list = *listPtr; if(list == NULL) return NULL; if(list->next == NULL) { *listPtr = NULL; return list; } while(list->next->next != NULL) list = list->next; CellPtr tmp = list->next; list->next = NULL; return tmp; } 中显示数据 我得到了OP引发的错误。

要解决我的问题,我必须创建一个默认的构造函数,如下所示: #include <stdlib.h> #include <stdio.h> typedef struct cell *CellPtr; typedef struct cell { int contents; /* contents of the cell */ CellPtr next; /* next cell in the list */ } Cell; CellPtr last_cell_out(CellPtr *listPtr) { CellPtr list = *listPtr; if(list == NULL) return NULL; if(list->next == NULL) { *listPtr = NULL; return list; } while(list->next->next != NULL) list = list->next; CellPtr tmp = list->next; list->next = NULL; return tmp; } CellPtr new_first_cell(CellPtr list, CellPtr c) { c->next=list; return c;/*returnes the start of the list*/ } void show_list(CellPtr list) { if(list == NULL) { printf("\n"); return; } printf("%d ", list->contents); show_list(list->next); } int main() { CellPtr list = NULL; CellPtr out; int i; show_list(list); CellPtr elem = malloc(sizeof(struct cell)); elem->contents = 0; list = new_first_cell(list, elem); show_list(list); out = last_cell_out(&list); show_list(list); list = new_first_cell(list, out); show_list(list); for(i = 1; i < 5; ++i) { CellPtr elem = malloc(sizeof(struct cell)); elem->contents = i; list = new_first_cell(list, elem); } show_list(list); out = last_cell_out(&list); show_list(list); list = new_first_cell(list, out); show_list(list); }

请注意,我正在使用JPA。我只是将默认构造函数添加到我的实体类中,然后运行我的Java应用程序并呈现了数据。

希望这对于错误消息有所帮助。