Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

654
Visualizações
En Spring Boot 2, ¿es posible generar automáticamente una JoinTable con una restricción única?

Estoy usando Spring Boot 2 y PostGres 10. He creado las siguientes entidades, Roles y Privilegios,

 @Data @Entity @Table(name = "Roles") public class Role { public enum Name { USER, ADMIN } @Id @GeneratedValue(strategy = GenerationType.AUTO) private UUID id; @Column(unique=true) @Enumerated(EnumType.STRING) private Name name; @ManyToMany @JoinTable( name = "roles_privileges", joinColumns = @JoinColumn( name = "role_id", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn( name = "privilege_id", referencedColumnName = "id")) private Collection<Privilege> privileges; }

El privilegio es

 @Data @Entity @Table(name = "Privileges") public class Privilege { public enum PrivilegeName { SUPER_ADMIN, USER } @Id @GeneratedValue(strategy = GenerationType.AUTO) private UUID id; @Column(unique=true) @Enumerated(EnumType.STRING) private PrivilegeName name; @ManyToMany(mappedBy = "privileges") private Collection<Role> roles; }

Entonces tengo esto en mi application.properties

 spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect spring.jpa.hibernate.ddl-auto=update spring.jpa.hibernate.show-sql=true spring.datasource.url=jdbc:postgresql://${PG_DB_HOST:localhost}:5432/${PG_DB_NAME} spring.datasource.username=${PG_DB_USER} spring.datasource.password=${PG_DB_PASS}

Cuando se generan mis tablas, la tabla roles_privileges se genera así...

 cardmania=# \d roles_privileges ; Table "public.roles_privileges" Column | Type | Modifiers --------------+------+----------- role_id | uuid | not null privilege_id | uuid | not null Foreign-key constraints: "fk5duhoc7rwt8h06avv41o41cfy" FOREIGN KEY (privilege_id) REFERENCES privileges(id) "fk629oqwrudgp5u7tewl07ayugj" FOREIGN KEY (role_id) REFERENCES roles(id)

¿Hay otras anotaciones u otro código Java que pueda agregar para que cuando se cree mi tabla de unión, el role_id/privilege_id tenga una clave única generada?

over 4 years ago · Santiago Trujillo
2 Respostas
Responde à pergunta

0

Para obligar a Hibernate a crear una clave principal con ambas columnas, debe cambiar Collection by Set

 public class Role { @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}) @JoinTable( name = "roles_privileges", joinColumns = @JoinColumn( name = "role_id", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn( name = "privilege_id", referencedColumnName = "id")) private Set<Privilege> privileges; }

Y:

 public class Privilege { @ManyToMany(mappedBy = "privileges") private Set<Role> roles; }

Clave principal generada automáticamente

over 4 years ago · Santiago Trujillo Relatório

0

  • No verá una restricción única pero verá la siguiente tabla
 create table roles_privileges ( role_id binary not null, privilege_id binary not null )
  • Pero puede declarar explícitamente su restricción única
 @ManyToMany @JoinTable( name = "roles_privileges", joinColumns = @JoinColumn(name = "role_id", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn( name = "privilege_id", referencedColumnName = "id"), uniqueConstraints = @UniqueConstraint(columnNames = {"role_id", "privilege_id"}, name = "rolesPrivilegesConstraint") ) private Collection<Privilege> privileges;
over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda