Salvar dados com Spring boot no Mysql

29 respostas
spring-bootmysqljava
J

Não estou conseguindo salvar os dados no banco.
O spring cria as tabelas mas não insere dados.

package repository;
import org.springframework.data.jpa.repository.JpaRepository;
import com.projeto.principal.entity.User;
public interface UserRepository extends JpaRepository<User, Long>{   }

Classe de Inicialização dos dados

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.stereotype.Component;
import com.projeto.principal.entity.User;
import repository.UserRepository;

@Component
public class DataInicializr implements ApplicationListener<ContextRefreshedEvent> {

	@Autowired
	UserRepository userRepository;
	
	@Override
	public void onApplicationEvent(ContextRefreshedEvent arg0) {
		//Sempre vai rodar no inicio da aplicacao
		User user = new User();
		user.setEmail("[email removido]");
		user.setNome("Maria dos Sados");		
		userRepository.save(user);				
	}
}

Classe User

package com.projeto.principal.entity;

import java.util.Set;

import javax.persistence.Entity;

import javax.persistence.GeneratedValue;

import javax.persistence.GenerationType;

import javax.persistence.Id;

import javax.persistence.ManyToMany;
@Entity
public class User {
	
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	private Long id;
	private String nome;
	private String email;
	
	@ManyToMany
	private Set<Role> roles;
		
	public Set<Role> getRoles() {
		return roles;
	}
	public void setRoles(Set<Role> roles) {
		this.roles = roles;
	}
	
	public User() {
		
	}
	public User(String nome, String email) {
		super();
		this.nome = nome;
		this.email = email;
	}
	
	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}	
}

29 Respostas

D

Exceção? Erros? Logs?

J

Darlan,
Não é exibido nenhum erro, nenhuma exceção…

L

Você não disse em que tabela vai salvar.
Só anotou sua entidade com @Entity e faltou a anotação @Table("nome_da_tabela").
Se for isso mesmo, avisa aqui pra gente e se não for vai dando mais infos.

D

Quando a anotação @Table é omitida, o JPA utiliza o nome da classe como nome da tabela, sendo esta anotação desnecessária quando não há diferenças entre o nome da tabela e da classe.

J

Entao, no meu banco o Spring cria a tabela User conforme a entity.

Só nao entendo o pq nao insere os dados…

D

Cara, sem log, é complicado.
Coloca a chamada ao metodo save do teu repository num try/catch capturando Exception e printa isso. Talvez esteja lançando, mas você está omitindo a captura da exceção.

J

Coloquei o try/catch na classe de inicialização dos dados. Porém, não gerou nenhuma exceção.

@Component
public class DataInicializr implements ApplicationListener<ContextRefreshedEvent> {

	@Autowired
	UserRepository userRepository;
	
	@Override
	public void onApplicationEvent(ContextRefreshedEvent arg0) {
		//Sempre vai rodar no inicio da aplicacao
		try {
			User user = new User();
			user.setEmail("[email removido]");
			user.setNome("Maria");		
			userRepository.save(user);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}				
	}
}

Quando a aplicação esta subindo vi essa mensagem de propriedade não encontrada do Hibernate. Não sei se pode ter alguma coisa a ver.

2019-04-17 10:25:07.967  INFO 11312 --- [           main] org.hibernate.Version                    : HHH000412: Hibernate Core {5.3.7.Final}
2019-04-17 10:25:07.973  INFO 11312 --- [           main] org.hibernate.cfg.Environment            : HHH000206: hibernate.properties not found
2019-04-17 10:25:08.562  INFO 11312 --- [           main] o.hibernate.annotations.common.Version   : HCANN000001: Hibernate Commons Annotations {5.0.4.Final}
2019-04-17 10:25:08.864  INFO 11312 --- [           main] org.hibernate.dialect.Dialect            : HHH000400: Using dialect: org.hibernate.dialect.MySQL5Dialect
2

Segue meu arquivo de configuração.

spring.jpa.hibernate.ddl-auto=update
spring.datasource.url=jdbc:mysql://localhost:3306/projeto1?useTimezone=true&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=xxxxxxxxxxxx
spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true
L

Achei que isso só era válido pra colunas/atributos. Aprendi algo novo. :slight_smile:

D

Cara, então está gravando.
A questão é, só tem um MySQL rodando?
Você está acessando o correto?
É meio bizarro perguntar, mas… já vi acontecer de ter 2 instâncias rodando e ter esse comportamento.

D

Por isso eu frequento o guj, mais para aprender do que para ensinar.

J

Então Darlan,
Só tenho um MySQL mesmo rodando.
O estranho é que a tabela User ele cria normalmente conforme a Entidade (Via Spring Boot), só os dados da classe DataInicializr que não esta sendo inseridos.

D

E a classe está rodando normalmente?
Por que não usa, ao invés dela, o arquivo data.sql?

L

Outra coisa, não anotar a classe UserRepository.java com @Repository faz com que o Spring consiga gerenciar ela?

Já que você está injetando uma classe que teoricamente não esteja sendo gerenciada pelo Spring pode ser que ela esteja “vindo” nula.

D

Se estiver no mesmo package e a configuração estiver certa, não deve haver problemas. Mas, seria bom checar isso

J

Coloquei essa notação tambem e não rolou…
O incrivel é nem dar mensagem de erro…

L

Tem como subir pro github ?
Se sim, upa lá e manda o link a gente (falo por mim, mas com certeza o pessoal também vai ajudar) pode mandar um pull-request se encontrar o problema.

J

Segue o link do GitHub.

L

Tô sem permissão pra mandar pull-requests.

Mas o que eu fiz foi:

  • Defini um padrão de pacotes. A anotação @SpringBootApplication precisa varrer
    o projeto pra gerenciar as classes que você quer que ele gerencie pra você. Em
    pacotes diferentes (como por exemplo com.projeto.principal e config) o Spring por padrão não enxerga, então você tem que dizer onde essas classes estão com o atributo scanBasePackages = “base.packages”. Ou seja, movi todos os pacotes que estavam fora de com.projeto.principal pra dentro dele. Por exemplo: com.projeto.principal.config e com.projeto.principal.repository e adicionei pro @SpringBootApplication(scanBasePackages = "com.projeto.principal") e em baixo dela adicionei a anotação @Entity(basePackages = "com.projeto.principal")

  • Adicionei o prefixo “tb_” nos nomes das tabelas pra evitar de sem querer
    usar uma palavra reservada. Eu não tava conseguindo criar a tabela user no PostgreSQL.

Se liberar lá pra eu poder mandar pull-request é só avisar aqui que eu mando o que eu fiz.

J

Lucas,
Testa novamente o pull-request.

L

Ainda bloqueado;

J

Autorizado

L

Pronto, meu jovem. Pull-request enviado.

J

Fala Lucas,

Ficou massa!

Rodei novamente o projeto, as tabelas foram criadas com o novo nome no banco, porem os dados nao foram inseridos…

image
O codigo esta certinho, ainda nao consegui entender o motivo do não salvamento dos dados.

L

Poxa vida. Aqui deu certinho. Porém, o banco que eu usei foi o PostgreSQL.

J

Percebi que vc esta usando Postgres… Será que pode haver algo com a versao do meu Mysql?

L

Cara, faz o seguinte. Adiciona a propriedade spring.jpa.show-sql=true no application.properties e vê se no console tá executando as queries.

J

Lucas,
No console só aparece os alters das tables.
Não é exibido os inserts.

2019-04-18 14:19:49.482  INFO 5492 --- [           main] org.hibernate.Version                    : HHH000412: Hibernate Core {5.3.7.Final}
2019-04-18 14:19:49.486  INFO 5492 --- [           main] org.hibernate.cfg.Environment            : HHH000206: hibernate.properties not found
2019-04-18 14:19:49.825  INFO 5492 --- [           main] o.hibernate.annotations.common.Version   : HCANN000001: Hibernate Commons Annotations {5.0.4.Final}
2019-04-18 14:19:50.007  INFO 5492 --- [           main] org.hibernate.dialect.Dialect            : HHH000400: Using dialect: org.hibernate.dialect.MySQL5Dialect
Hibernate: alter table tbl_user_roles add constraint FKta4da9pgr5u17vnj1nio6yy3g foreign key (roles_id) references tbl_role (id)
Hibernate: alter table tbl_user_roles add constraint FKl05y56lrr3c2hu3mb2yjojjfe foreign key (user_id) references tbl_user (id)
F

Dentro do MySQL, vc verificou se tá sendo gravado? Verificou a validade da query?

J

Verifiquei sim e não esta sendo gravado.

Agora quanto a validade da query, nao consegui entender rs

Criado 17 de abril de 2019
Ultima resposta 18 de abr. de 2019
Respostas 29
Participantes 4