1

I am getting a "No Identifier error" the entity class "QuestionResponse" has an two @Id fields . There is a OneToMany relationship between Question and QuestionResponse and OnetoMany relationship between Response and QuestionResponse and all these classes are designed based on https://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/Hibernate_User_Guide.html#associations-many-to-many-bidirectional-with-link-entity

I am using Postgres 9.5, Spring Boot 2.0.1 and deploying it on WildFly 11

Thanks!

questions.sql

CREATE TABLE questions( 
    id BIGSERIAL PRIMARY KEY,
    question VARCHAR(255)
);

respones.sql

CREATE TABLE responses( 
    id BIGSERIAL PRIMARY KEY,
    response VARCHAR(255)
);

question_respone.sql #

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)
);

Question.java

@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;
    }
}

QuestionResponse.java

@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;
    }

}

Response.java

@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;
    }

}

WildFly console

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
samdset
  • 233
  • 1
  • 5
  • 19
  • Will either of the answers to this question help you? https://stackoverflow.com/questions/41143913/sql-jpa-multiple-columns-as-primary-key – geneSummons May 17 '18 at 22:28
  • @geneSummons I don't think they will apply to my problem. One of the challenges is the many to many mapping between Question and Response. Which is done via QuestionResponse – samdset May 17 '18 at 22:30
  • 1
    The "no identifier specified for entity" error is telling you the compiler isn't finding an "ID" column defined, probably because your QuestionResponse class/table has a multi-column primary key instead of a single column primary key. The answers to the linked question explain two ways to implement a multi-column primary key entity. – geneSummons May 17 '18 at 23:15

1 Answers1

3

In JPA, you cannot use the @Id annotation on more than one field in an entity, unless you are defining it as a composite primary key. So you need to add @IdClass to your QuestionResponse entity so that it consists multiple primary key fields.

This might not relate to your issue, but it would also be worth having a look at this article that shows the best way to use the @ManyToMany annotation with JPA.

Luay Abdulraheem
  • 751
  • 3
  • 11
  • I have seen this example and is of not much use, since I need to write queries to my question_response table for which there needs to be an entity class. This example doesn't cover my requirement – samdset May 18 '18 at 00:11
  • I have added that example just because I saw you have a `@MayToMany` relationship and thought it might help you. Your main issue is because you have more than one `@Id` in an entity that is not marked as `@IdClass`. – Luay Abdulraheem May 18 '18 at 02:07