[英]org.hibernate.PropertyAccessException: Could not set field value with Composite Key
[英]nested exception is org.hibernate.PropertyAccessException: Could not set field value
我正在開發一個Spring-boot 2項目,該項目用於添加MCQ問題,選項和答案。 一個問題的選項可能從2到6個選項不等。
我創建了3個表:一個用於問題,一個用於選項,一個用於答案。
下面是我在Spring Boot中的模型。
我在郵遞員中收到請求時遇到OptionModel和AnswerModel錯誤。
請幫助解決錯誤並幫助我改善代碼。
Question.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 + '\'' +
'}';
}
}
Options.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 +
'}';
}
}
Answer.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 +
'}';
}
}
郵遞員錯誤:
提出問題的請求工作正常。
GET請求選項表:
{
"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"
}
GET請求答案表:
{
"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() +
'}';
}
}
嵌套異常
如此問題所示:您正在嘗試序列FetchType.LAZY
而未加載相關對象(您正在使用FetchType.LAZY
)。
您有2個選擇:
不要使用FetchType.LAZY
,而應使用FetchType.EAGER
(如果您的數據庫更復雜,則可能不是最佳解決方案)。
使用@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
注釋Option
和Question
類。 這將忽略那些類的序列化。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.