OneToOne 与休眠 JPA
OneToOne with hibernate JPA
我正在尝试关联两个表
用户和地址
一个用户只有一个地址,一个地址只属于一个用户。密钥按地址 ID 列出
所以我先创建我的地址然后我创建一个用户和link它有一个地址ID
但是我根本做不到,我在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
我对休眠完全陌生,但我需要这个项目上大学所以请原谅我对这个问题的无知
那是我的代码:
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;
控制器
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();
}
}
申请
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);
}
}
这就是我的逻辑模型
编辑
我试图删除“映射者”部分并从地址中删除@OneToOne,但现在当我尝试发送地址的 POST 时 return 出现以下错误:
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]
就好像他没有输入任何地址字段一样
我通过邮递员这样发送我的 POST:
{
"bairro": "Vila Prmavera",
"cep": "03388110",
"cidade": "São Paulo",
"complemento": "b1",
"logradouro": "Rua das dores",
"numeroLogradouro": 7,
"uf": "SP"
}
不要映射到 ID。 Map是实体映射,不是id映射。
public class Endereco {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
@OneToOne
private Usuario usuario
....
}
或者,如果您不希望 Endereco 保留对 Usuario 的引用,只需将其删除即可。但是您不能将 @OneToOne
放在 id 字段上。如果你只有一侧 @OneToOne
那么你还需要注释 @MapsId
.
public class Usario {
@NotNull
@MapsId
@OneToOne(cascade = CascadeType.ALL)
private Endereco endereco;
public class Endereco {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id
}
因为 @OneToOne
试图映射到数据库中的 table 实体。对于 id,数据库中没有任何实体或 Table。这就是它抱怨的原因
我正在尝试关联两个表
用户和地址 一个用户只有一个地址,一个地址只属于一个用户。密钥按地址 ID 列出 所以我先创建我的地址然后我创建一个用户和link它有一个地址ID 但是我根本做不到,我在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
我对休眠完全陌生,但我需要这个项目上大学所以请原谅我对这个问题的无知
那是我的代码:
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;
控制器
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();
}
}
申请
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);
}
}
这就是我的逻辑模型
编辑 我试图删除“映射者”部分并从地址中删除@OneToOne,但现在当我尝试发送地址的 POST 时 return 出现以下错误:
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]
就好像他没有输入任何地址字段一样
我通过邮递员这样发送我的 POST:
{
"bairro": "Vila Prmavera",
"cep": "03388110",
"cidade": "São Paulo",
"complemento": "b1",
"logradouro": "Rua das dores",
"numeroLogradouro": 7,
"uf": "SP"
}
不要映射到 ID。 Map是实体映射,不是id映射。
public class Endereco {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
@OneToOne
private Usuario usuario
....
}
或者,如果您不希望 Endereco 保留对 Usuario 的引用,只需将其删除即可。但是您不能将 @OneToOne
放在 id 字段上。如果你只有一侧 @OneToOne
那么你还需要注释 @MapsId
.
public class Usario {
@NotNull
@MapsId
@OneToOne(cascade = CascadeType.ALL)
private Endereco endereco;
public class Endereco {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id
}
因为 @OneToOne
试图映射到数据库中的 table 实体。对于 id,数据库中没有任何实体或 Table。这就是它抱怨的原因