gpt4 book ai didi

java - 嵌套异常是 org.hibernate.PropertyAccessException : Could not set field value

转载 作者:行者123 更新时间:2023-12-01 19:40:07 24 4
gpt4 key购买 nike

我正在开发一个 Spring-boot 2 项目,该项目用于添加 MCQ 问题、选项和答案。每个问题的选项可能有 2 到 6 个选项。

我创建了 3 个表格:一张用于问题,一张用于选项,一张用于答案。

下面是我在 Spring Boot 中的模型。

当我在 postman 中收到请求时,我收到 OptionsModel 和 AnswerModel 错误。

请帮助解决错误并帮助我改进我的代码。

问题.java

@Entity
@Table(name = "mcq_question")
public class Question {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long questionId;

@Column(nullable = false)
private String question;

public Question() { }

public Long getQuestionId() {
return questionId;
}

public void setQuestionId(Long questionId) {
this.questionId = questionId;
}

public String getQuestion() {
return question;
}

public void setQuestion(String question) {
this.question = question;
}

@Override
public String toString() {
return "Question{" +
"questionId=" + questionId +
", question='" + question + '\'' +
'}';
}
}

选项.java:

@Entity
@Table(name = "mcq_Options")
public class Option {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "option_id")
private int optionId;

private String option;

@ManyToOne(fetch = FetchType.LAZY, targetEntity = Question.class)
@JoinColumn(name = "questionId", nullable = false )
private Question questionId;

public Option() { }

public Option(String option, Question questionId) {
this.option = option;
}

public int getOptionId() {
return optionId;
}

public void setOptionId(int optionId) {
this.optionId = optionId;
}

public String getOption() {
return option;
}

public void setOption(String option) {
this.option = option;
}

public Question getQuestionId() {
return questionId;
}

public void setQuestionId(Question questionId) {
this.questionId = questionId;
}

@Override
public String toString() {
return "Option{" +
"optionId=" + optionId +
", option='" + option + '\'' +
", questionId=" + questionId +
'}';
}
}

答案.java

@Entity
@Table(name = "mcq_answer")
public class Answer {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int answerId;

@OneToOne(fetch = FetchType.LAZY, targetEntity = Question.class)
@JoinColumn(name = "questionId", nullable = false)
private int questionId;

@OneToOne(fetch = FetchType.LAZY, targetEntity = Option.class)
@JoinColumn(name = "optionId", nullable = false)
private int optionId;

public Answer(){}

public Answer(int questionId, int optionId) {
this.questionId = questionId;
this.optionId = optionId;
}

public int getAnswerId() {
return answerId;
}

public void setAnswerId(int answerId) {
this.answerId = answerId;
}

public int getQuestionId() {
return questionId;
}

public void setQuestionId(int questionId) {
this.questionId = questionId;
}

public int getOptionId() {
return optionId;
}

public void setOptionId(int optionId) {
this.optionId = optionId;
}

@Override
public String toString() {
return "Answer{" +
"answerId=" + answerId +
", questionId=" + questionId +
", optionId=" + optionId +
'}';
}
}

postman 错误:

获取问题请求工作正常。

获取选项表请求:

{
"timestamp": "2019-04-12T05:18:09.831+0000",
"status": 500,
"error": "Internal Server Error",
"message": "Type definition error: [simple type, class org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: java.util.ArrayList[0]->com.bluepi.TrainingProject.model.Option[\"questionId\"]->com.bluepi.TrainingProject.model.Question$HibernateProxy$RND9ZBYW[\"hibernateLazyInitializer\"])",
"path": "/api/admin/viewmcqop"
}

获取答案表请求:

{
"timestamp": "2019-04-12T04:56:59.823+0000",
"status": 500,
"error": "Internal Server Error",
"message": "Could not set field value [Option{optionId=2, option='option2', questionId=Question{questionId=1, question='Question1'}}] value by reflection : [class com.bluepi.TrainingProject.model.Answer.optionId] setter of com.bluepi.TrainingProject.model.Answer.optionId; nested exception is org.hibernate.PropertyAccessException: Could not set field value [Option{optionId=2, option='option2', questionId=Question{questionId=1, question='Question1'}}] value by reflection : [class com.bluepi.TrainingProject.model.Answer.optionId] setter of com.bluepi.TrainingProject.model.Answer.optionId",
"path": "/api/admin/viewmcqans"
}

最佳答案

Answer 存在问题类

在您的 Answer 中类,您在关系中使用了错误的字段类型。该关系应该是您所关联的类的类型,而不是 id 字段的类型。

所以你的 Answer 类应该像这样:

@Entity
@Table(name = "mcq_answer")
public class Answer {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int answerId;

@OneToOne(fetch = FetchType.LAZY, targetEntity = Question.class)
@JoinColumn(name = "questionId", nullable = false)
private Question questionId;

@OneToOne(fetch = FetchType.LAZY, targetEntity = Option.class)
@JoinColumn(name = "optionId", nullable = false)
private Option optionId;

public Answer(){}

public Answer(Question questionId, Option optionId) {
this.questionId = questionId;
this.optionId = optionId;
}

public int getAnswerId() {
return answerId;
}

public void setAnswerId(int answerId) {
this.answerId = answerId;
}

public Question getQuestionId() {
return questionId;
}

public void setQuestionId(Question questionId) {
this.questionId = questionId;
}

public Option getOptionId() {
return optionId;
}

public void setOptionId(Option optionId) {
this.optionId = optionId;
}

@Override
public String toString() {
return "Answer{" +
"answerId=" + answerId +
", questionId=" + questionId.getQuestionId() +
", optionId=" + optionId.getOptionId() +
'}';
}
}

嵌套异常

this所示问题:您试图在相关对象未加载时序列化子项(您正在使用 FetchType.LAZY )。

您有 2 个选择:

  • 而不是使用FetchType.LAZY ,使用FetchType.EAGER (如果您的数据库更复杂,可能不是最好的解决方案)。

  • 注释 OptionQuestion类(class) @JsonIgnoreProperties({"hibernateLazyInitializer", "handler"}) 。这将忽略这些类的序列化。

关于java - 嵌套异常是 org.hibernate.PropertyAccessException : Could not set field value,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55644954/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com