Можно ли создать сущность с двумя значениями первичного ключа? - PullRequest
1 голос
/ 04 апреля 2019

У меня проблема с одним Entity, который содержит unique_key, так что, возможно, мне нужно создать это Entity с двумя PrimaryKey, возможно ли это вообще?

Это мой Entity

@Entity
public class UserAnswerQuestion extends DateAudit {

    @Id
    @Column(name = "useranswerquestion_id")
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "useranswerquestion_seq")
    @SequenceGenerator(name = "useranswerquestion_seq", allocationSize = 1)
    private Long id;

    @ManyToOne
    private User user;
    @ElementCollection
    private List<Answer> answerList;
    @ManyToOne
    private Question question;

    private Boolean passed;

    private Boolean shown;

    public UserAnswerQuestion(){
    }
....

И проблема, когда я пытаюсь создать этот Entity с другим User, он говорит:

org.postgresql.util.PSQLException: ОШИБКА: двойное значение ключа нарушает уникальное ограничение "uk_6v3tlg1gflua8r8d4wlqxo7v5" Подробно: ключ (answer_list_answer_id) = (11) уже существует.

Так что я хотел бы сделать User как @Id, если это возможно, и, возможно, это решит мою проблему ...

EDIT

Я создал класс UserAnswerQuestionId, например:

public class UserAnswerQuestionId implements Serializable {

@Column(name = "useranswerquestion_id")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "useranswerquestion_seq")
@SequenceGenerator(name = "useranswerquestion_seq", allocationSize = 1)
private Long id;

@Column(name ="user_id")
private Long user_id;

public UserAnswerQuestionId(){

}

public UserAnswerQuestionId(Long user_id) {
    this.user_id = user_id;
}

А затем в сущности UserAnswerQuestion я изменил ее на:

 @EmbeddedId
 private UserAnswerQuestionId userAnswerQuestionId;

Но ошибка теперь говорит:

org.hibernate.id.IdentifierGenerationException: null id generated for:class com.pew.model.useranswers.UserAnswerQuestion
    at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:125) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final]
    at org.hibernate.event.internal.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:192) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final]
    at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:135) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final]
    at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:62) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final]
    at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:800) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final]
    at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:785) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final]

Редактировать 2

Я внимательно читаю ошибку и похоже, что проблема в

@ElementCollection
private List<Answer> answerList;

Как мне решить эту проблему, чтобы этот элемент повторился на этом Entity?

Возможно, я смогу определить эти @ElementCollection, чтобы они не были уникальными? так можно повторить на этой сущности?

Это моя Answer сущность

@Entity(name = "answer")
public class Answer extends DateAudit {

@Id
@Column(name = "answer_id")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "answer_seq")
@SequenceGenerator(name = "answer_seq", allocationSize = 1)
private Long id;

@Column(name = "answerToQuestion")
private String answerToQuestion;

Ответы [ 3 ]

1 голос
/ 06 апреля 2019

Возможно, вам, возможно, придется лучше объяснить ваш вариант использования Из контекстной информации похоже, что вы хотите получить пользователей и ответы, которые они предоставили для различных вопросов. В этом случае вам может понадобиться таблица ассоциации, как показано ниже.

ANSWERS_FOR_QUESTIONS

public class User extends DateAudit { //This assumes you are intested in retrieving User and their answer(s) in the domain model.

    @Id
    private Long id; //userid.



    @ManyToMany
    @JoinTable(name = “ANSWERS_FOR_QUESTIONS”, //More appropriate name may be : ANSWERS_BY_USERS
           joinColumns = { @JoinColumn(name = “user_id”) }, //fk
           inverseJoinColumns = { @JoinColumn(name = “question_id”) }) //fk
    private Set<Answers> answers = new HashSet<Answers>();
0 голосов
/ 06 апреля 2019

Включая UserAnswerQuestionId с помощью @IdClass должно работать:

@Entity
@IdClass(UserAnswerQuestionId.class)
public class UserAnswerQuestion extends DateAudit {

    @Id
    private Long id;

    @Id
    private Long user_id;

    @ElementCollection
    private List<Answer> answerList;
    @ManyToOne
    private Question question;

    private Boolean passed;

    private Boolean shown;

    public UserAnswerQuestion(){
    }
0 голосов
/ 04 апреля 2019

Первичный ключ всегда только 1 и уникален. Это может быть составной ключ из нескольких столбцов кортежа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...