Tout d'abord, je sais que cela ne devrait pas être une solution, mais j'ai besoin de résoudre le problème de cette façon.Force Hibernate @OneToOne relation (LIMIT 1)
J'ai une OneToOne relation qui, très rarement, n'est pas respectée (DB renvoie deux lignes au lieu d'une). J'ai besoin de forcer cette relation, quelque chose comme LIMIT 1 pour cette requête Hibernate spécifique.
@Entity
@Table(name="contact", uniqueConstraints = @UniqueConstraint(columnNames="user_id"))
public class ContactDTO implements Serializable {
(...)
// Force this relation
@OneToOne(cascade = CascadeType.REFRESH, fetch = FetchType.LAZY, optional = true)
@JoinColumn(name = "user_id", unique = true, insertable = false, updatable = false)
public UserDTO getBaseUser() {
return baseUser;
}
public void setBaseUser(UserDTO baseUser) {
this.baseUser = baseUser;
}
@Column(name = "user_id", unique = true)
public Integer getUserId() {
return this.userId;
}
@Entity
@Table(name = "base_user")
public class UserDTO implements Serializable {
(...)
@OneToOne(fetch = FetchType.LAZY, mappedBy = "baseUser")
public ContactDTO getContact() {
return contact;
}
public void setContact(ContactDTO contact) {
this.contact = contact;
}
Quand je reçois deux lignes (maximum), Hibernate génère l'exception suivante:
org.hibernate.HibernateException: More than one row with the given identifier was found
Est-ce possible ou je vraiment besoin de transformer cette relation en @OneToMany ?
Remarque: Hibernate 3.3, malheureusement, je ne peux pas utiliser JoinColumnsOrFormula.
Nous vous remercions de votre aide! Cordialement.
Pourriez-vous préciser les entités et les tables impliquées? –
Bien sûr. Ajouté un peu plus d'informations, je pense que c'est suffisant pour comprendre la logique. –
Vous pouvez toujours passer à la relation OneToMany, mais utilisez-la dans un champ privé. Ensuite, fournissez des getters et setters qui fonctionnent uniquement sur le premier élément. Il va essentiellement encapsuler votre situation indésirable sans avoir d'autres codes à connaître à ce sujet. –