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
3
  • Will either of the answers to this question help you? stackoverflow.com/questions/41143913/… Commented May 17, 2018 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 Commented May 17, 2018 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. Commented May 17, 2018 at 23:15

1 Answer 1

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.

Sign up to request clarification or add additional context in comments.

2 Comments

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
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.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.