J'ai un problème avec une Entité
qui contient une unique_key
alors peut-être que ce dont j'ai besoin est de créer cette Entité
avec deux PrimaryKey est-ce encore possible?
Ceci est mon Entity
@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;
Et le problème lorsque j'essaye de créer ceci Entité
avec un autre utilisateur
il dit:
org.postgresql.util.PSQLException: ERREUR: la valeur de clé en double enfreint la contrainte unique "uk_6v3tlg1gflua8r8d4wlqxo7v5" Détail: la clé (answer_list_answer_id) = (11) existe déjà.
Donc, ce que j'aimerais faire, c'est faire de User
un @Id
si possible, et peut-être que cela résout mon problème ... p>
Ce que j'ai fait est de créer une classe UserAnswerQuestionId
comme ceci:
@ElementCollection private List<Answer> answerList;
Et puis dans l'entité UserAnswerQuestion
Je l'ai changée en:
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]
Mais l'erreur indique maintenant:
@EmbeddedId private UserAnswerQuestionId userAnswerQuestionId;
Je lis attentivement l'erreur et il semble que le problème se trouve dans le
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; }
Comment résoudre ce problème pour permettre à cet élément de se répéter sur cette Entity
?
Peut-être puis-je définir ces @ElementCollection comme n'étant pas uniques? peut donc être répété sur cette entité?
Ceci est mon entité Answer
@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(){ } ....
3 Réponses :
La clé primaire est toujours unique et unique. Il peut s'agir d'une clé composite composée d'un tuple de plusieurs colonnes.
L'inclusion de votre UserAnswerQuestionId
en utilisant @IdClass
devrait fonctionner:
@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(){ }
Vous devrez peut-être mieux expliquer votre cas d'utilisation. À partir des informations contextuelles, il semble que vous souhaitiez récupérer les utilisateurs et les réponses qu'ils ont fournies pour diverses questions. Dans ce cas, vous n'aurez peut-être besoin que d'un tableau d'association comme ci-dessous.
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>();