GUJ Discussões   :   últimos tópicos   |   categorias   |   GUJ Respostas

Salvar dados com Spring boot no Mysql

spring-boot
mysql
java
Tags: #<Tag:0x00007fa6c57cbe88> #<Tag:0x00007fa6c57cbd20> #<Tag:0x00007fa6c57cbb90>
#1

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;
	}	
}
0 Likes

#2

Exceção? Erros? Logs?

0 Likes

#3

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

0 Likes

#4

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.

0 Likes

#5

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 Like

#6

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

Só nao entendo o pq nao insere os dados…

0 Likes

#7

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.

0 Likes

#8

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
0 Likes

#9

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

0 Likes

#10

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.

0 Likes

#11

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

1 Like

#12

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.

0 Likes

#13

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

0 Likes

#14

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.

0 Likes

#15

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

0 Likes

#16

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

0 Likes

#17

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.

0 Likes

#18

Segue o link do GitHub.

0 Likes

#19

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.

0 Likes

#20

Lucas,
Testa novamente o pull-request.

0 Likes