23

Lavorando su qualche codice di ibernazione legacy.Come eseguire più colonne UniqueConstraint in hbm?

Come faccio quanto segue con hbm.xml (file di mappatura di ibernazione) anziché con annotazioni?

@Table(name="users", uniqueConstraints = { 
    @UniqueConstraint(columnNames={"username", "client"}), 
    @UniqueConstraint(columnNames={"email", "client"}) 
}) 
public class User implements Serializable { 
    private static final long serialVersionUID = 1L; 
    @Id 
    private int id; 
    private String username; 
    private String email; 
    private Client client; 
} 

risposta

20

usare il tag properties: estratto

... 
<properties name="uk1" unique="true"> 
     <property name="username" .../> 
     <many-to-one name="client" .../> 
</properties> 

<properties name="uk2" unique="true"> 
     <property name="email" .../> 
     <many-to-one name="client" update="false" insert="false" .../> 
</properties> 
... 

Documentazione:

Il < proprietà > elemento permette la definizione di un nome, raggruppamento logico di proprietà di una classe. Il più importante uso del costrutto è che consente a una combinazione di proprietà di essere il target di un ref di proprietà. È anche un modo conveniente per definire un vincolo univoco a più colonne .

Tutte le opzioni disponibili sono descritte nello Hibernate documentation.

+0

Ciao, so che questo è quello che dice la documentazione, ma non ha funzionato per me. La soluzione era il mettere il 'unique' all'interno del tag' column' invece del 'property' tag' ' –

+1

Non so perché il tag delle proprietà non ha funzionato per te (versione di ibernazione?) ma la tua definizione non sarà in grado di modellare un vincolo univoco a più colonne. – Thierry

+0

è Hibernate 3, e la soluzione che ho dato ha funzionato come volevo! –

2

Si può anche fare questo:

<many-to-one name="client" unique-key="uk1,uk2" .../> 
    <property name="username" unique-key="uk1" .../> 
    <property name="email" unique-key="uk2" .../> 

Non è necessario utilizzare il tag in HBM. Se si desiderano più vincoli univoci.

+0

Si prega di vedere questo primo [how-to-answer] (https://stackoverflow.com/help/how-to-answer) Questa domanda viene data risposta prima, ovviamente, è possibile aggiungere il tuo rispondi qui Ma devi capire alcuni punti prima di rispondere. Innanzitutto, non aggiungere una risposta che è stata precedentemente aggiunta con lo stesso codice o suggerimento. In secondo luogo, non aggiungere una risposta eccessivamente complicata se l'utente ha chiesto in modo molto specifico il problema e di cosa ha bisogno per risolverlo. Terzo, puoi aggiungere un commento se vuoi suggerire qualcosa riguardo la risposta o la domanda. –