【发布时间】:2019-09-29 16:42:49
【问题描述】:
我花了一整天的时间来解决这个问题,但是我仍然没有得到它的原因,因为我的 projet 和 controle 表不是空的,为什么 JPA 寻找一个 id=0 的 Controle?:
WARN 5764 --- [nio-8080-exec-4] .w.s.m.s.DefaultHandlerExceptionResolver:已解决 [org.springframework.http.converter.HttpMessageNotWritableException:无法写入 JSON:无法找到 com.demo.model.Controle 的 ID 0;嵌套异常是 com.fasterxml.jackson.databind.JsonMappingException: Unable to find com.demo.model.Controle with id 0 (通过引用链: java.util.ArrayList[0]->com.demo.model.Projet[" Controle"]->com.demo.model.Control$HibernateProxy$aqtpKvMx["nomControle"])]
这是我的两个模型:
项目实体:
@Entity
@Table(name="projets")
public class Projet implements Serializable{
//other properties
//.....
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
@JoinColumn(name="id_controle")
private Controle controle;
//....
//other getters and sitters
public Controle getControle() {
return Controle;
}
public void setControle(Controle controle) {
this.Controle = controle;
}
}
** 控制实体:**
@Entity
@Table(name="controle")
public class Controle implements Serializable{
private static final long serialVersionUID = -7906212173191059200L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name="id_controle", nullable=false)
private int idControle;
@Column(name="nom_controle", nullable = true)
private String nomControle;
@Column(name="tel_controle", nullable = true)
private String telControle;
@Column(name="email_controle", nullable = true)
private String emailControle;
@Column(name="address_controle", nullable = true)
private String addressControle;
protected Controle() {
}
public Controle(String nom, String tel, String email, String address) {
super();
this.nomControle = nom;
this.telControle = tel;
this.emailControle= email;
this.addressControle = address;
}
//other getters and sitters
public String getNomControle() {
return nomControle;
}
public void setNomControle(String nomControle) {
this.nomControle = nomControle;
}
当我尝试通过JpaRepository 的getAllProjet() 方法获取所有项目时出现此错误。
ProjetController:这个方法以前有效,现在它触发了错误:
@GetMapping("/projets")
public List<Projet> getAllProjet(){
List<Projet> p = projetRepository.findAll();
Collections.reverse(p);
return p;
}
我也在客户端收到此错误:
HttpErrorResponse {headers: HttpHeaders, status: 500, statusText: "OK", url: "http://localhost:8080/api/v1/projets", ok: false, ...}
提前谢谢你。
【问题讨论】:
-
该列表包含一个 Projet,它应该与 ID 为 0 的 Controle 相关联,但该 controle 不存在。因此,您在数据库中的数据似乎处于不连贯的状态(应该有一个外键约束,使项目无法引用不存在的 Controle)。请注意,您发布的代码无法编译...
-
@JBNizet 好吧,我在 Projet 和 Controle 之间有外键关系......在一切正常之前,这就是为什么我不明白原因。请解释一下为什么这段代码无法编译?谢谢
-
因为一个名为 BureauxControle 的类有一个名为 Controle 的构造函数,因为你使用 Controle 等引用了一个名为 controle 的变量。
-
是的,你说得对,这只是一个错误,我会纠正它
-
很可能是因为,正如消息和我的评论所说,其中一个项目引用了 ID 为 0 的控件,即 projet 表的其中一行具有值为 0 的 id_controle。
标签: java spring hibernate spring-boot spring-data-jpa