2014-07-09 15 views
9

Ist es möglich, eindeutige Einschränkungen für Member einer eingebetteten Klasse in Hibernate zu definieren?Eindeutige Einschränkungen für Member eines eingebetteten Members in Hibernate

muss ich sicher sein, dass Nested :: i1 und Nested :: i2 als Paar einzigartig sind (die Kombination)

@Entity 
@Table(uniqueConstrains = ???) 
public class Widget { 
    @Id 
    private int id; 

    @Embedded 
    Nested nested; 
} 

@Embeddable 
public class Nested { 
    private int i1; 
    private int i2; 
} 

Antwort

5

Es ist möglich, unter Verwendung von:

@Entity 
@Table(uniqueConstraints = { @UniqueConstraint(columnNames = {"i1", "i2"})}) 
public class Widget { 

Es wäre führen in CREATE SQL (postgresql Beispiel)

create table Widget 
( id int8 not null, 
    i1 int8, 
    i2 int8 , 
    primary key (id), 
    unique (i1, i2) 
) 

Optional - es wäre wahrscheinlich mehr consise und lesbar, wenn Sie @AttributeOverride Anmerkung specyfying in einer Datei hinzufügen - Spaltennamen für beide Attribute

@AttributeOverrides({ 
     @AttributeOverride(name = "i1", column = @Column(name = "i1")), 
     @AttributeOverride(name = "i2", column = @Column(name = "i2")) 
}) 
@Embedded 
Nested nested; 
+0

Thnaks, das ist großartig. Eine Sache beunruhigt mich sehr, dass, wenn sich die Feldnamen von "Nested" ändern, jede Klasse, die sie als Embedded verwendet, Probleme hat ... irgendwelche Muster, um dieses Problem zu lösen? –

+0

@JoshuaMN leider gibt es dafür kein Muster, aber die Chancen, dass 'Nested' Klassenfelder ihre Namen ändern, sind ziemlich klein, wenn man den Zweck der Verwendung eingebetteter Klassen annimmt. Sie können auch auf die Idee von '@ AttributeOverride' verzichten, da es in diesem Fall nichts bedeutet (ich denke nur, dass der Code bei der Verwendung mehr Bedeutung hat). –

Verwandte Themen