当我尝试从 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 应用程序,它就会呈现数据。
希望这在某种程度上有助于错误消息。