2011-03-10 7 views
5

Tengo un buen problema. Retomaré el contexto.JPA Cómo agregar un único contraint en la columna para la relación @OneToMany como en el nombre de usuario

Tengo una clase: Site que representan un sitio web, y una clase User.

Un sitio puede tener varios usuarios.

class Site { 

    private int site_ID; 

    @OneToMany // with a join table 
    private List<User> users; 
    // ... 
} 

class User { 

    private int user_ID; 

    private String name; 

    private String lastname; 

    private String username; 

    private String password; 

} 

Quiero permitir que el mismo nombre de usuario exista en todos los sitios, pero solo uno por sitio.

Site/User/username 
1 /1 /username1 
1 /2 /username2 
2 /3 /username1 

¿Cómo puedo hacer eso?

gracias

Respuesta

8

Deje que el usuario tenga una referencia del sitio:

@ManyToOne(optional=false) 
private Site site; 

Ahora añada la restricción al usuario:

@Table(uniqueConstraints = { 
    @UniqueConstraint(columnNames = { "username", "site" })) 
} @Entity 
public class User{ 
// etc 
} 

También tendrá que cambiar el mapeo del sitio:

@OneToMany(mappedBy="site") 
private List<User> users; 
+0

El PO dijo que quería utilizar una tabla de unión para su OneToMany. Además, incluso si quisiera una clave externa, su restricción única no es útil ya que id ya es única (lo que garantiza que id/site siempre será) –

+0

@JB Nizet: a) seguro, cree que una tabla de unión es la correcta qué hacer, pero sugiero no usar uno (no parece tener ningún sentido en este caso) b) ese fue mi error, quise decir nombre de usuario, no user_id (fijo) –

+0

Thks, voy a intentarlo esta noche. Entonces, si quiero hacer eso, ¿debo mantener una referencia al Sitio en mi objeto Usuario? Al principio, quería mantener a los niños que no sabían que sus padres, sé que soy una mala persona. –

1

Verificar @UniqueConstraint. Permite definir cualquier restricción única

6

De forma predeterminada, el índice principal de la tabla de combinación es único y se basa en el sitio. y usuario FK Por lo tanto, no puede tener el mismo usuario duplicado con el mismo sitio.

Pero si desea forzar una restricción:

class Site { 

    private int site_ID; 

    @OneToMany // with a join table 
    @JoinTable(
     [email protected](columnNames={"Site_ID","users_ID"}) 
    ) 
    private List<User> users; 
    // ... 
} 
Cuestiones relacionadas