2010-06-18 12 views
8

Korzystanie poniższy kod:Hibernacja: @UniqueConstraint z polem @ManyToOne?

@Entity 
@Table(uniqueConstraints=[@UniqueConstraint(columnNames=["account","name"])]) 
class Friend { 
    @Id @GeneratedValue(strategy=GenerationType.AUTO) 
    public Long id 
    @ManyToOne 
    public Account account 
    public String href 
    public String name 
} 

pojawia się następujący błąd:

org.hibernate.AnnotationException: Unable to create unique key constraint (account, name) on table Friend: account not found 

wydaje się to ma do czynienia z ograniczeniem @ManyToOne, co ja sobie wyobrazić faktycznie tworzy oddzielny UniqueConstraint ???

W każdym razie, jeśli biorę na to uwagę, nie ma skargi o UniqueConstraint, ale jest inny błąd, który sprawia mi wierzyć, to musi być pozostawiony w.

org.hibernate.MappingException: Could not determine type for: com.mksoft.fbautomate.domain.Account, at table: Friend, for columns: [org.hibernate.mapping.Column(account)] 

Wszelkie wskazówki w jaki sposób można utworzyć takie pożądane ograniczenie (tj. że każda kombinacja konta i nazwy występuje tylko raz?)

Dziękuję!

Misha

+0

Czy rozwiązanie @ Peter'a działa u Ciebie? – Reddy

Odpowiedz

12

Rozwiązanie:

@Entity 
@Table(uniqueConstraints=[@UniqueConstraint(columnNames=["myaccountcolum","name"])]) 
class Friend { 
    @Id @GeneratedValue(strategy=GenerationType.AUTO) 
    public Long id 
    @ManyToOne 
    @JoinColumn(name="myaccountcolum") 
    public Account account 
    public String href 
    public String name 
} 

Objaśnienie: Nazwa kolumna dla @ManyToOne w wygenerowanym tabeli będzie prawdopodobnie coś account_id zamiast rachunku. @UniqueConstraint oczekuje dokładnej nazwy kolumny, a nie nazwy używanej w klasie. Aby upewnić się, że to po prostu działa, nadaj tej kolumnie konkretną nazwę za pomocą @JoinColumn i upewnij się, że ta sama nazwa jest używana w UnikacieConstraint.