总是当我尝试从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);
答案 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应用程序并呈现了数据。
希望这对于错误消息有所帮助。