I'm trying to relate two tables
User and Address A user has a single address, an address belongs to only one user. Keys are listed by the ID of an Address so I create my address first and then I create a user and link it with an address id But I can't do it at all, I have the following error in return:
Error creating bean with name 'entityManagerFactory' defined in class path resource [org / springframework / boot / autoconfigure / orm / jpa / HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is java.lang.NullPointerException: Cannot invoke "org.hibernate.mapping.PersistentClass.getTable ()" because "classMapping" is null
i'm totally new to hibernate but i need this project for college so forgive me for the ignorance on the subject
Thats my code:
USER/USUARIO Class:
import org.hibernate.validator.constraints.br.CPF;
import javax.persistence.*;
import javax.validation.constraints.*;
public class Usuario{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column
@NotNull
@Size(min = 5,max = 30)
@Pattern(regexp = "^[a-zA-Z\s]*$", message = "Nome inválido! Digite apenas letras e espaçamento") //Permite apenas letras e espaço
private String nome;
@NotNull
@CPF
private String cpf;
@NotNull
@Email
private String email;
@NotNull
@Size(min = 5,max = 12)
private String senha;
private Integer telefone;
@DecimalMin("0")
@DecimalMax("5")
private Double avaliacao;
@NotNull
@OneToOne(cascade = CascadeType.ALL,mappedBy = "id")
private Endereco endereco;
//Atributos para usuários autônomos
private Boolean isAutonomo;
private String categoriaAutonomo;
private Double precoAutonomo;
//Getters and Setters
ADRESS/ENDERECO Class
import javax.persistence.*;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
@Entity
@Table(name = "endereco")
public class Endereco {
@Id
@OneToOne
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
@NotNull
@Size(min = 8,max = 8)
private String cep;
@NotNull
private String bairro;
@NotNull
private String logradouro;
@NotNull
private Integer numeroLogradouro;
private String complemento;
@NotNull
@Size(min = 2,max = 2)
private String uf;
@NotNull
private String cidade;
CONTROLLER
import br.com.bandtec.projetocaputeam.dominio.*;
import br.com.bandtec.projetocaputeam.repository.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import java.util.List;
@RestController
@RequestMapping("/caputeam")
public class CaputeamController {
@Autowired
private UsuariosRepository usuariosRepository;
@Autowired
private EnderecoRepository enderecoRepository;
//--- USERS
@GetMapping("/usuarios")
public ResponseEntity getUsuarios(){
List<Usuario> usuarios = usuariosRepository.findAll();
return !usuarios.isEmpty() ? ResponseEntity.status(200).body(usuarios) :
ResponseEntity.status(204).build();
}
@PostMapping("/cadastrar-usuario")
public ResponseEntity cadastrarUsuario(@RequestBody @Valid Usuario novoUsuario){
usuariosRepository.save(novoUsuario);
return ResponseEntity.ok().build();
}
//--- ADRESS
@PostMapping("/cadastrar-endereco")
public ResponseEntity cadastrarEndereco(@RequestBody @Valid Endereco novoEndereco){
enderecoRepository.save(novoEndereco);
return ResponseEntity.ok().build();
}
}
APPLICATION
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class ProjetoCaputeamApplication {
public static void main(String[] args) {
SpringApplication.run(ProjetoCaputeamApplication.class, args);
}
}
And thats my Logic Model
EDIT I tried to delete the "mapped by" part and remove the @OneToOne from Address but now it returns the following error when I try to send an POST of Adress:
org.h2.jdbc.JdbcSQLIntegrityConstraintViolationException: Referential integrity constraint violation: "FKMXNOON0IKGA83W1A203Y6OFPN: PUBLIC.ENDERECO FOREIGN KEY(ID) REFERENCES PUBLIC.USUARIO(ID) (1)"; SQL statement:
insert into endereco (bairro, cep, cidade, complemento, logradouro, numero_logradouro, uf, id) values (?, ?, ?, ?, ?, ?, ?, ?) [23506-200]
as if he didn’t enter any Address fields
Im sending my POST by Postman like this:
{
"bairro": "Vila Prmavera",
"cep": "03388110",
"cidade": "São Paulo",
"complemento": "b1",
"logradouro": "Rua das dores",
"numeroLogradouro": 7,
"uf": "SP"
}
Don't map on the Id. Map means entity mapping not id mapping.
public class Endereco {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
@OneToOne
private Usuario usuario
....
}
Or if you don't want Endereco to hold a reference to a Usuario just remove it. But you can't place @OneToOne
on the id field. If you have only on one side the @OneToOne
then you need also the annotation @MapsId
.
public class Usario {
@NotNull
@MapsId
@OneToOne(cascade = CascadeType.ALL)
private Endereco endereco;
public class Endereco {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id
}
Because @OneToOne
tries to Map with an entity which means to a table in Database. For id there isn't any entity or Table in the database. That is why it complains
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With