Salvar dados com Spring boot no Mysql

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("msantos@gmail.com");
		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;
	}	
}

Exceção? Erros? Logs?

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

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.

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.

1 curtida

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

Só nao entendo o pq nao insere os dados…

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.

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("maria@gmail.com");
			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

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

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.

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

1 curtida

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.

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

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.

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

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

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.

Segue o link do GitHub.

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.

Lucas,
Testa novamente o pull-request.