Zunächst einmal weiß ich, dass dies keine Lösung sein sollte, aber ich muss das Problem auf diese Weise beheben.Force Hibernate @ OneToOne Beziehung (LIMIT 1)
Ich habe eine OneToOne Beziehung, die, sehr selten, nicht respektiert wird (DB gibt zwei Zeilen statt einer). Ich muss diese Beziehung erzwingen, etwas wie ein LIMIT 1 für diese spezifische Hibernate-Abfrage.
@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;
}
Wenn ich zwei Reihen (maximal) erhalten, wirft Hibernate die folgende Ausnahme:
org.hibernate.HibernateException: More than one row with the given identifier was found
Ist das möglich oder muss ich wirklich diese Beziehung in eine @OneToMany drehen ?
Hinweis: Hibernate 3.3, leider kann ich JoinColumnsOrFormula nicht verwenden.
Vielen Dank für Ihre Hilfe! Mit freundlichen Grüßen.
Könnten Sie bitte die beteiligten Entitäten und Tabellen näher erläutern? –
Sicher. Ich habe ein paar zusätzliche Informationen hinzugefügt, ich denke, es ist genug, um die Logik zu verstehen. –
Sie können immer zur OneToMany-Beziehung wechseln, aber sie in einem privaten Feld verwenden. Stellen Sie dann Getter und Setter bereit, die nur mit dem ersten Element arbeiten. Es wird im Grunde Ihre unerwünschte Situation kapseln, ohne dass Sie anderen Code darüber wissen müssen. –