Ich habe zwei Felder einer Entitätsklasse, die nicht eindeutig sein soll, sondern als zusammengesetzte Felder für einen Schlüssel verwendet werden soll, der selbst eindeutig sein muss. Zum Beispiel habe ich zwei Felder (Name und Version), die für andere Datensätze identisch sein können, aber zusammen müssen sie eindeutig sein. Was ist der beste Weg, um Hibernate (mit Anmerkungen) zu verwenden? Ich benutze Hibernate Validator für andere Felder, aber ich bin mir nicht sicher, wie ich das verwenden kann, um zu bestätigen, dass zwei Felder zusammen einen eindeutigen Schlüssel bilden. Ich benutze eine generische Entity-Klasse, die einen id-generischen Typ hat, der für eine Composite-Key-Klasse ausgelagert werden kann, aber ich muss noch, dass das sehr gut funktioniert.Wie bekomme ich einen eindeutigen Schlüssel für zwei Felder mit Hibernate?
Antwort
wird dies einen eindeutigen Schlüssel für die Datenbank erstellen:
@Table(name = "MYTABLE",
uniqueConstraints = { @UniqueConstraint(columnNames = { "NAME", "VERSION" }) })
Dies wird durch die Datenbank auf einem Update oder anhalten erzwungen wird.
Sie müssten Ihren eigenen benutzerdefinierten Validator schreiben, wenn Sie dies mit dem Hibernate Validator erzwingen möchten.
und was sollte in der Entität als pk geschrieben werden ... wenn der PK Name und Version ist –
@ yoav.str - Wenn der PK der Name und die Version ist, sollten Sie stattdessen einen zusammengesetzten Primärschlüssel mit @ Id/@ verwenden IdClass oder @ EmbeddedId/@ Embeddable – mtpettyp
Dies funktionierte für mich mit Hibernate 3.6.3.Final. Vielen Dank! – Jorge
Normalerweise werden die beiden Felder in eine innere Schlüsselklasse eingeschlossen, die als @Embeddable markiert ist. Zum Beispiel:
@Entity
public class Foo {
@EmbeddedId()
private Key key;
...
@Embeddable
public static class Key {
@Column(nullable=false)
private String name;
@Column(nullable=false)
private int version;
protected Key() {
// for hibernate
}
public Key (String name, int version) {
this.name = name;
this.version = version;
}
...
// You probably want .equals and .hashcode methods
}
}
Möchten Sie eine "eindeutige Einschränkung" auf zwei Spalten oder einen "Primärschlüssel" auf der Tabelle, die aus zwei Spalten besteht? –
Ich möchte eine eindeutige Einschränkung für zwei Spalten. Zum Beispiel muss die Kombination aus Name und Version eindeutig sein. So könnte ich zwei Datensätze in der Tabelle mit Datensatz # 1 (Name = abc/Version = 1) und mit Datensatz # 2 (Name = abc/Version = 2), aber nicht zwei Datensätze in der Tabelle mit Datensatz # 1 (Name = abc/version = 1) und mit Datensatz # 2 (name = abc/version = 1). –