23

Trabajando con algún código heredado de hibernación.¿Cómo hacer múltiples columnas UniqueConstraint en hbm?

¿Cómo hago lo siguiente con hbm.xml (hibernate mapping file) en lugar de anotaciones?

@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; 
} 

Respuesta

20

Utilice la properties etiqueta: extracto

... 
<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> 
... 

Documentación:

El <propiedades> elemento permite la definición de un agrupamiento lógico con nombre de las propiedades de una clase. El uso más importante de la construcción es que permite que una combinación de propiedades sea el objetivo de una propiedad-ref. También es una forma conveniente de definir una restricción única de columna múltiple .

Todas las opciones disponibles se describen en el Hibernate documentation.

+0

Hola, sé que eso es lo que dice la documentación, pero eso no funcionó para mí. La solución fue poner el 'unique' dentro de la etiqueta' column' en lugar de 'property' tag' ' –

+1

No sé por qué la etiqueta de propiedades no funcionó para usted (¿versión de hibernación?) pero su definición no podrá modelar una restricción única de varias columnas. – Thierry

+0

es Hibernate 3, ¡y la solución que di funcionó exactamente como yo quería! –

2

También puede hacer esto:

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

No es necesario utilizar la etiqueta de HBM. Si solo quiere múltiples restricciones únicas.

+0

Consulte primero este [cómo-para-responder] (https://stackoverflow.com/help/how-to-answer) Esta pregunta se responde antes, obviamente, puede agregar su responde aquí Pero necesitas entender algunos puntos antes de responder. Primero, no agregue una respuesta que se haya agregado previamente con el mismo código o sugerencia. Segundo, no agregue una respuesta demasiado complicada si el usuario ha preguntado muy específicamente sobre el problema y lo que necesita para resolverlo. En tercer lugar, puede agregar un comentario si desea sugerir algo con respecto a la respuesta o pregunta. –

Cuestiones relacionadas