3
respostas

http://localhost:8080/auth (esta montando o join com uma tabela que nao existe)

estou fazendo um teste com o banco de dados Oracle, consegui conectar tudo , so que quando eu chamo o http://localhost:8080/auth no POST com o Bory: { "email" : "aluno@email.com", "senha": "123456" }

da erro, ele monta o join errado com uma tabela que nao existe:

=========================================================== Hibernate: select usuario0_.id as id1_2_, usuario0_.email as email2_2_, usuario0_.nome as nome3_2_, usuario0_.senha as senha4_2_ from usuariodaniel usuario0_ where usuario0_.email=? Hibernate: select perfis0_.usuario_id as usuario_id1_3_0_, perfis0_.perfis_id as perfis_id2_3_0_, perfil1_.id as id1_0_1_, perfil1_.nome as nome2_0_1_ from usuariodaniel_perfis perfis0_ inner join perfildaniel perfil1_ on perfis0_.perfis_id=perfil1_.id where perfis0_.usuario_id=? 2022-08-22 09:14:24.114 WARN 9364 --- [nio-8080-exec-1] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 942, SQLState: 42000 2022-08-22 09:14:24.114 ERROR 9364 --- [nio-8080-exec-1] o.h.engine.jdbc.spi.SqlExceptionHelper : ORA-00942: a tabela ou view não existe

===========================================================

não existe essa tabela "usuariodaniel_perfis"

as tabelas que eu criei no meu banco são essas:

=================USUARIO=====================

CREATE TABLE usuariodaniel ( id NUMBER(6,0) NOT NULL, email VARCHAR2(255) NULL, nome VARCHAR2(255) NULL, senha VARCHAR2(255) NULL ) ALTER TABLE usuariodaniel ADD PRIMARY KEY ( id )

=================PERFIL=====================

CREATE TABLE perfildaniel ( id NUMBER(6,0) NOT NULL, nome VARCHAR2(30) NULL ) ALTER TABLE perfildaniel ADD PRIMARY KEY ( id )

3 respostas

Oi Paulo,

O relacionamento entre usuário e perfil é muitos para muitos, o que exige uma terceira tabela no banco de dados.

É a tabela que vai armazenar quais perfis cada usuário tem. Nessa tabela terá apenas 2 colunas, sendo chaves estrangeiras para a tabela de usuário e para a tabela de perfil.

eu resolvi o problema assim: na minha classe "Usuario".

disso:
    @ManyToMany(fetch = FetchType.EAGER)
    private List<Perfil> perfis = new ArrayList<>();

para isso: @ManyToMany(fetch = FetchType.EAGER) @JoinTable(name = "usuariodaniel",joinColumns = @JoinColumn(name = "id"),inverseJoinColumns = @JoinColumn(name = "idperfil")) private List perfis = new ArrayList<>();

Desse jeito que voce fez ele vai usar a própria tabela de usuários para armazenar o relacionamento, o que semanticamente é incorreto. O correto é criar a terceira tabela e passar o nome dela na anotação @JoinTable.