Hibernate ignora propriedade name do @Column

Spring

Hibernate

Java

Spring Data

Spring Data JPA

31/07/2019

Boa noite pessoal,

Seguinte eu tenho uma classe GenericEntity e Usuario, ambas descritas abaixo:
@Component
@MappedSuperclass
public abstract class GenericEntity implements Serializable {

	private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "id_generator")
    protected Long id;

	public abstract Long getId();
	
	public abstract void setId(Long id);
}


@Entity
@Component
@Table(name = "USUARIO")
@SequenceGenerator(initialValue = 1, allocationSize = 1, name = "id_generator", sequenceName = "SEQ_USUARIO_ID_USUARIO")
public class Usuario extends GenericEntity {

    private static final long serialVersionUID = 1L;


    @NotBlank
    @Column(name = "NOME", nullable = false, unique = true)
    private String nome;

    @NotBlank
    @Column(name = "LOGIN", nullable = false, unique = true)
    private String login;

    @NotBlank
    @Column(name = "SENHA", nullable = false)
    private String senha;

//    @ManyToOne
//    @JoinColumn(name = "ID_CLIENTE", foreignKey = @ForeignKey(name = "FK_US_CLI"))
//    private Cliente cliente;

//    @OneToMany
//    @JoinTable(name = "USUARIO_PERMISSOES",
//            joinColumns = @JoinColumn(name = "ID_USUARIO"),
//            inverseJoinColumns = @JoinColumn(name = "ID_PERMISSAO"))
    @Transient
    private Set<Permissoes> permissoes;

    @Transient
    private String jwtToken;

    public Usuario() {
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getLogin() {
        return login;
    }

    public void setLogin(String login) {
        this.login = login;
    }

    public String getSenha() {
        return senha;
    }

    public void setSenha(String senha) {
        this.senha = senha;
    }

//    public Cliente getCliente() {
//        return cliente;
//    }
//
//    public void setCliente(Cliente cliente) {
//        this.cliente = cliente;
//    }

    public Set<Permissoes> getPermissoes() {
        return permissoes;
    }

    public void setPermissoes(Set<Permissoes> permissoes) {
        this.permissoes = permissoes;
    }

    public String getJwtToken() {
        return jwtToken;
    }

    public void setJwtToken(String jwtToken) {
        this.jwtToken = jwtToken;
    }

    @Override
    @Column(name = "ID_USUARIO")
    public Long getId() {
        return id;
    }

    @Override
    public void setId(Long id) {
        this.id = id;
    }
}


O problema que está ocorrendo é que ao invés dele fazer o select com o nome da coluna como ID_USUARIO, ele pega o nome do atributo declarado no GenericEntity que é id, aí dá erro no banco de que a coluna não foi encontrada. Isso começou a ocorrer após eu tirar a criação automática do hibernate, pois decidi que não quero usá-la, e sim fazer a mão mesmo.

Já tentei tirar o @Id do GenericEntity aí lança o erro java.lang.IllegalArgumentException: This class [dev.ourcycle.cyclemanager.model.entity.GenericEntity] does not define an IdClass.
Aí tirando o @MappedSuperclass muda para o erro not managed bean do spring.

Não tenho ideia do que fazer para arrumar, pois eu vou precisar de uma GenericEntity com mais atributos e com o @Id dá problema e sem também.
Se alguém puder me ajudar nisso, ficarei muito grato.

Qualquer dúvida só falar, talvez tenha ficado difícil de entender kk.
Lucas Rezende

Lucas Rezende

Curtidas 0

Melhor post

Lucas Rezende

Lucas Rezende

01/08/2019

Consegui resolver, era só colocar a anotação @AttributeOverride(name = "id", column = @Column(name = "ID_USUARIO")) classe filha e pronto, deu tudo certo. Vlw!!
GOSTEI 1

Mais Respostas

Marcio Souza

Marcio Souza

31/07/2019

Olá Lucas.
Usar a anotação @Column(name = "id_usuario") no mapeamento da classe filha não vai funcionar. Se pretende trabalhar com uma classe genérica, use apenas ID como o nome das suas colunas.
GOSTEI 0
Lucas Rezende

Lucas Rezende

31/07/2019

Olá Lucas.
Usar a anotação @Column(name = "id_usuario") no mapeamento da classe filha não vai funcionar. Se pretende trabalhar com uma classe genérica, use apenas ID como o nome das suas colunas.


Certo, mas a questão é que por questão de organização e padronização, não quero deixar os ids com o nome de ID somente, nesse caso a solução seria retirar o id da classe pai e colocar somente na classe filha, porém por causa da @MappedSuperclass se eu tirar o id fica dando o erro do IdClass no pai citado anteriormente, não há outra forma de eu fazer a herança sem ter que colocar um id na classe pai?
GOSTEI 0
POSTAR