Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Como o Spring Boot reconhece a tabela de UsuarioPerfis?

Primeiramente gostaria de agradecer imensamente todo conteúdo ministrado nesse curso, foi de grande valia para meu desempenho em meu trabalho. Vou primeiro passar informações sobre a API que desenvolvi ao longo do Curso, Minha API é uma aplicação que simplesmente cadastrar e lista informações, nada muito complexo... Utilizo um banco de dados Oracle que contém minhas tabelas...

aplication.properties:

#DataSource
spring.datasource.driverClassName=oracle.jdbc.driver.OracleDriver
spring.datasource.url=jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=dbsdtc100.usinacoruripe.com.br)(PORT=1101)))(CONNECT_DATA=(SERVICE_NAME=devdb)))
spring.datasource.username=sa
spring.datasource.password=sasasa

#JPA
spring.jpa.database-platform=org.hibernate.dialect.Oracle12cDialect
spring.jpa.properties.hibernate.show_sql=true 
spring.jpa.properties.hibernate.format_sql=true

#Boot
spring.jpa.defer-datasource-initialization=true

Classe Perfil:

@Entity
@Table(name = "t_perfis_api", schema = "global")
public class Perfil implements GrantedAuthority{

    private static final long serialVersionUID = 1L;

    @Id @Column(name = "SEQ_PERFIL")
    private Integer id;

    @Column(name = "DSC_PERFIL")
    private String name;

    @Override
    public String getAuthority() {
        return this.name;
    }

}

Classe Usuario

@Entity
@Table(name = "t_usuarios_api", schema = "global")
public class Usuario implements UserDetails {

    private static final long serialVersionUID = 1L;

    @Id @Column(name = "COD_USUARIO")
    private Long idUsuario;

    @Column(name = "NOM_LOGIN")
    private String loginUsuario;

    @Column(name = "NOM_SENHA")
    private String senhaUsuario;    

    @Column(name = "NOM_USUARIO")
    private String nomeUsuario;

    @Column(name = "DSC_EMAIL")
    private String emailUsuario;

    @Column(name = "DAT_EXPIRACAO")
    private LocalDateTime dataExpiracao;

    @Column(name = "STA_BLOQUEIO")
    private Integer staBloqueio;

    @ManyToMany(fetch = FetchType.EAGER)
    private Set<Perfil> perfis;

    <Todos os métodos Getters e Setters existem, retirei pois excedeu o limite de caracteres >

//     Métodos implementados da classe "UserDetails"

    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        return this.perfis;
    }

    @Override
    public String getPassword() {
        return this.senhaUsuario;
    }

    @Override
    public String getUsername() {
        return this.loginUsuario;
    }

    @Override
    public boolean isAccountNonExpired() {
        return true;
    }

    @Override
    public boolean isAccountNonLocked() {
        return true;
    }

    @Override
    public boolean isCredentialsNonExpired() {
        return true;
    }

    @Override
    public boolean isEnabled() {
        return true;
    }
}

Banco de dados: Tabela de PerfisTabela de UsuariosTabela de Usuario_PerfilEstou recebendo o seguinte erro do Console do Eclipse no momento em que tento fazer login para pegar o Token Erro, enviei imagem pois excedeu o limite de caracteres

Caused by: Error : 942, Position : 206, Sql = select perfis0_.usuario_cod_usuario as usuario_cod_usuari1_3_0_, perfis0_.perfis_seq_perfil as perfis_seq_perfil2_3_0_, perfil1_.seq_perfil as seq_perfil1_0_1_, perfil1_.dsc_perfil as dsc_perfil2_0_1_ from t_usuarios_api_perfis perfis0_ inner join global.t_perfis_api perfil1_ on perfis0_.perfis_seq_perfil=perfil1_.seq_perfil where perfis0_.usuario_cod_usuario=:1 , OriginalSql = select perfis0_.usuario_cod_usuario as usuario_cod_usuari1_3_0_, perfis0_.perfis_seq_perfil as perfis_seq_perfil2_3_0_, perfil1_.seq_perfil as seq_perfil1_0_1_, perfil1_.dsc_perfil as dsc_perfil2_0_1_ from t_usuarios_api_perfis perfis0_ inner join global.t_perfis_api perfil1_ on perfis0_.perfis_seq_perfil=perfil1_.seq_perfil where perfis0_.usuario_cod_usuario=?, Error Msg = ORA-00942: a tabela ou view não existe

    at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:637)
    ... 164 more

Estou com um pressentimento que o Spring Boot não está encontrando minha tabela T_USUARIO_PERFIL, até porque eu não encontrei no curso aonde eu declaro ela...

3 respostas

Oi Marcelo,

O nome da tabela de join é determinada de acordo com o relacionamento:

@ManyToMany(fetch = FetchType.EAGER)
private Set<Perfil> perfis;

O padrão é a tabela se chamar t_usuarios_api_perfis pois ele concatena o nome da tabela da entidade junto com o nome do atributo.

Renomeei a tabela para "t_usuarios_api_perfis" e percebi que realmente ele tenta buscar essa tabela na query, copiei a query de erro, formatei e percebi que ao declarar a tabela no "FROM" ele não coloca "GLOBAL." para fazer referência ao meu outro schema, seria esse o problema do Oracle ainda me retornar: "Error Msg = ORA-00942: a tabela ou view não existe"?

SELECT
    perfis0_.usuario_cod_usuario AS usuario_cod_usuari1_3_0_,
    perfis0_.perfis_seq_perfil   AS perfis_seq_perfil2_3_0_,
    perfil1_.seq_perfil          AS seq_perfil1_0_1_,
    perfil1_.dsc_perfil          AS dsc_perfil2_0_1_
FROM
         t_usuarios_api_perfis perfis0_
    INNER JOIN global.t_perfis_api perfil1_ ON perfis0_.perfis_seq_perfil = perfil1_.seq_perfil
WHERE
    perfis0_.usuario_cod_usuario = :1 , OriginalSql = SELECT
                    perfis0_.usuario_cod_usuario AS usuario_cod_usuari1_3_0_,
                    perfis0_.perfis_seq_perfil   AS perfis_seq_perfil2_3_0_,
                    perfil1_.seq_perfil          AS seq_perfil1_0_1_,
                    perfil1_.dsc_perfil          AS dsc_perfil2_0_1_
                FROM
                         t_usuarios_api_perfis perfis0_
                    INNER JOIN global.t_perfis_api perfil1_ ON perfis0_.perfis_seq_perfil = perfil1_.seq_perfil
                WHERE
                    perfis0_.usuario_cod_usuario = ?
solução!

Consegui resolver o problema criando outra tabela T_USUARIOS_API_PERFIS no schema que eu inicializo no application.properties alterando as colunas para "PERFIS_SEQ_PERFIL" e "USUARIO_COD_USUARIO", desse jeito o spring boot entendeu e me deixou logar kkk, obrigado pela atenção!!!