Java Spring Boot JPA Hibernate:即使实体类中存在@Id,也没有为实体错误指定标识符
我得到一个“无标识符错误”,实体类“QuestionResponse”有两个@Id字段。问题与问题回答、回答与问题回答之间存在一种一元关系,所有这些类都是基于 我正在使用Postgres 9.5、Spring Boot 2.0.1,并将其部署在WildFly 11上 谢谢 questions.sql respones.sql 问题_respone.sql# Question.java Response.javaJava Spring Boot JPA Hibernate:即使实体类中存在@Id,也没有为实体错误指定标识符,java,spring,hibernate,spring-boot,jpa,Java,Spring,Hibernate,Spring Boot,Jpa,我得到一个“无标识符错误”,实体类“QuestionResponse”有两个@Id字段。问题与问题回答、回答与问题回答之间存在一种一元关系,所有这些类都是基于 我正在使用Postgres 9.5、Spring Boot 2.0.1,并将其部署在WildFly 11上 谢谢 questions.sql respones.sql 问题_respone.sql# Question.java Response.java 在JPA中,不能对实体中的多个字段使用@Id注释,除非将其定义为复合主键。因此,您需
在JPA中,不能对实体中的多个字段使用
@Id
注释,除非将其定义为复合主键。因此,您需要将@IdClass
添加到QuestionResponse
实体中,以便它包含多个主键字段
这可能与您的问题无关,但也值得一看,它显示了在JPA中使用
@ManyToMany
注释的最佳方法。此问题的答案是否对您有所帮助@但我认为它们不会适用于我的问题。挑战之一是问题和响应之间的多对多映射。这是通过QuestionResponse完成的“没有为实体指定标识符”错误告诉您编译器没有找到定义的“ID”列,可能是因为QuestionResponse类/表具有多列主键而不是单列主键。链接问题的答案解释了实现多列主键实体的两种方法。我已经看到了这个示例,但没有太多用处,因为我需要将查询写入需要实体类的question_响应表。这个例子没有涵盖我的要求。我之所以添加这个例子,是因为我看到你有一个@maytomy
关系,并认为这可能会对你有所帮助。您的主要问题是,在未标记为@IdClass
的实体中有多个@Id
。
CREATE TABLE questions(
id BIGSERIAL PRIMARY KEY,
question VARCHAR(255)
);
CREATE TABLE responses(
id BIGSERIAL PRIMARY KEY,
response VARCHAR(255)
);
CREATE TABLE question_response(
question_id bigint REFERENCES questions ON DELETE CASCADE,
response_id bigint REFERENCES responses ON DELETE CASCADE,
PRIMARY KEY ( question_id, response_id)
);
@Entity
@Table(name = "questions")
public class Question{
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="qid_seq")
@SequenceGenerator(name = "qid_seq", sequenceName="questions_id_seq")
@Column(name = "id")
private Long id;
@Column(name = "questionText")
private String questionText;
@OneToMany(mappedBy = "question", cascade = CascadeType.ALL, orphanRemoval = true)
private List<QuestionResponse> responses;
public Question() {}
public Question(String questionText) {
super();
this.questionText = questionText;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getQuestionText() {
return questionText;
}
public void setQuestionText(String questionText) {
this.questionText = questionText;
}
public List<QuestionResponse> getResponses() {
return responses;
}
}
@Entity
@Table(name = "question_response")
public class QuestionResponse {
@Id
@ManyToOne
private Question question;
@Id
@ManyToOne
private Response response;
public QuestionResponse() {
super();
}
public QuestionResponse(Question question, Response response) {
super();
this.question= question;
this.response = response;
}
public Question getQuestion() {
return question;
}
public void setQuestion(Question question) {
this.question = question;
}
public Response getResponse() {
return response;
}
public void setResponse(Response response) {
this.response = response;
}
}
@Entity
@Table(name = "responses")
public class Response {
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="rid_seq")
@SequenceGenerator(name = "rid_seq", sequenceName="questions_id_seq")
@Column(name = "id")
private Long id;
@Column(name = "responseText")
private String responseText;
@OneToMany(mappedBy = "response", cascade = CascadeType.ALL, orphanRemoval = true)
private List<QuestionResponse> question;
public Response() {}
public Response(String responseText) {
super();
this.responseText = responseText;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getResponseText() {
return responseText;
}
public void setResponseText(String responseText) {
this.responseText = responseText;
}
public List<QuestionResponse> getQuestion() {
return question;
}
}
13:54:49,581 ERROR [org.springframework.boot.SpringApplication] (ServerService Thread Pool -- 86) Application run failed: org.springframework.beans.factory.BeanCreationException:
Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]:
Invocation of init method failed; nested exception is org.hibernate.AnnotationException:
No identifier specified for entity: com.poc.questionnarie.QuestionResponse