Hallo,
ich versuche seit Tagen, einen zusammengesetzten Primärschlüssel in Hibernate zu realisieren.
Was ich erreichen will:
Primärschlüssel: user_id(Fremdschlüssel), project_id(Fremdschlüssel), property_name
Spalte: property_value
Schließlich soll also jeder Kombination aus user_id, project_id, property_name eine property_value zugeordnet werden.
Mein Code bis jetzt:
Code:
@Entity
@Table(name = "user_properties")
@AssociationOverrides({
@AssociationOverride(name="id.user", joinColumns = @JoinColumn(name="user_id", nullable=false)),
@AssociationOverride(name="id.project", joinColumns = @JoinColumn(name="project_id", nullable=false))
})
@AttributeOverrides({
@AttributeOverride(name = "id.property_name", column = @Column(name = "property_name", nullable = false))
})
public class WebAppUserProperty implements Serializable {
private static final long serialVersionUID = -1325251396121465392L;
@EmbeddedId
private UserPropertyPK id = new UserPropertyPK();
@Column(name = "property_value", nullable = false)
private String property_value; // value
// Getter, Setter, ...
}
@Embeddable
class UserPropertyPK implements Serializable {
private static final long serialVersionUID = 572566244363842292L;
@ManyToOne
private WebAppUser user; // user
@ManyToOne
private WebAppProject project; // project
@Column(name = "property_name", nullable = false)
private String property_name; // name
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (!(obj instanceof UserPropertyPK)) {
return false;
}
final UserPropertyPK castOther = (UserPropertyPK) obj;
return new EqualsBuilder().append(user, castOther.user)
.append(project, castOther.project).append(property_name, castOther.property_name).isEquals();
}
@Override
public int hashCode() {
return new HashCodeBuilder().append(user).append(project).append(property_name).toHashCode();
}
// Getter, Setter, ...
}
In meiner DAO-Klasse habe ich folgenden Code:
Code:
@Override
public void setProperty(WebAppUserProperty webAppUserProperty) {
sessionFactory.getCurrentSession().saveOrUpdate(webAppUserProperty);
}
Wenn die Tabelle "user_properties" leer ist, wird kein neuer Eintrag erstellt.
Wenn ein Eintrag bereits vorhanden ist, der einen unterschiedlichen Primärschlüssel besitzt wie der Eintrag, der hinzugefügt werden soll, passiert auch nichts.
Existiert hingegen bereits ein Eintrag mit dem gleichen Primärschlüssel, wird folgende Exception ausgelöst:
org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [de.tu_darmstadt.bp.global.model.WebAppUserProperty#de.tu_darmstadt.bp.global.model.UserPropertyPK@ee341dbe]
Gleichzeitig bekomme ich in der Konsole
"ERROR DefaultConverterManager:399 - No converter found for 'de.tu_darmstadt.bp.global.model.UserPropertyPK'"
angezeigt. (Wobei das anscheinend nichts mit Hibernate sondern mit DWR zu tun hat, was ich verwende)
Vielleicht kann mir hier jemand helfen.