Bom dia.
Tenho as seguintes classes:
@Entity
@Table(name = "cartorio")
public class Cartorio implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String nome;
private String endereco;
@OneToMany(mappedBy = "cartorio", cascade = CascadeType.ALL)
private List<Certidao> certidoes;
public Cartorio() {
}
public Cartorio(Long id, String nome, String endereco, List<Certidao> certidoes) {
this.id = id;
this.nome = nome;
this.endereco = endereco;
this.certidoes = certidoes;
}
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 getEndereco() {
return endereco;
}
public void setEndereco(String endereco) {
this.endereco = endereco;
}
public List<Certidao> getCertidoes() {
return certidoes;
}
public void setCertidoes(List<Certidao> certidoes) {
this.certidoes = certidoes;
}
}
public class CartorioDTO implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
private String nome;
private String endereco;
private List<Certidao> certidoes;
public CartorioDTO() {
}
public CartorioDTO(Long id, String nome, String endereco, List<Certidao> certidoes) {
this.id = id;
this.nome = nome;
this.endereco = endereco;
this.certidoes = certidoes;
}
public CartorioDTO(Cartorio entity) {
id = entity.getId();
nome = entity.getNome();
endereco = entity.getEndereco();
certidoes = entity.getCertidoes();
}
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 getEndereco() {
return endereco;
}
public void setEndereco(String endereco) {
this.endereco = endereco;
}
public List<Certidao> getCertidoes() {
return certidoes;
}
public void setCertidoes(List<Certidao> certidoes) {
this.certidoes = certidoes;
}
@Entity
@Table(name = "certidao")
public class Certidao implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String nome;
@ManyToOne(fetch = FetchType.LAZY)
private Cartorio cartorio;
public Certidao() {
}
public Certidao(Long id, String nome, Cartorio cartorio) {
this.id = id;
this.nome = nome;
this.cartorio = cartorio;
}
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 Cartorio getCartorio() {
return cartorio;
}
public void setCartorio(Cartorio cartorio) {
this.cartorio = cartorio;
}
public class CertidaoDTO implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
private String nome;
private Cartorio cartorio;
public CertidaoDTO() {
}
public CertidaoDTO(Long id, String nome, Cartorio cartorio) {
this.id = id;
this.nome = nome;
this.cartorio = cartorio;
}
public CertidaoDTO(Certidao entity) {
id = entity.getId();
nome = entity.getNome();
cartorio = entity.getCartorio();
}
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 Cartorio getCartorio() {
return cartorio;
}
public void setCartorio(Cartorio cartorio) {
this.cartorio = cartorio;
}
Porém não estou sabendo salvar a entidade…
{
"nome": "222ssss aa",
"endereco": "a1ss2ss21a",
"certidoes": [
{"nome": "ABC" },
{"nome" : "XYZ"}
]
}
retono:
{
"id": 1,
"nome": "222ssss aa",
"endereco": "a1ss2ss21a",
"certidoes": [
{
"id": 1,
"nome": "ABC",
"cartorio": null
},
{
"id": 2,
"nome": "XYZ",
"cartorio": null
}
]
}
alguém poderia me ajudar?
Não entendi. Pelo retorno, parece que salvou tudo (todos tem o ID atribuído)
no caso, o cartorio retorna null, desta forma não salva o id do cartorio na tabela certidao… nao consegui incluir o cartorio para ser salvo tbm
Entendi. Antes de chamar o save
, vc deve percorrer a lista de certidões setando a instância de cartorio
em cada certidão
. Pelo que me lembro, o JPA não faz isso automaticamente.
1 curtida
pelo que entendi, seria algo desta forma:
Cartorio entity = new Cartorio();
BeanUtils.copyProperties(dto, entity);
Certidao c = new Certidao();
List<Certidao> certidoes = new ArrayList<>();
for (int i=0; i<certidoes.size(); i++) {
c.setCartorio(entity);
}
porém desta forma não deu certo
Dessa forma você está sentando o cartório somente na certidão que foi criada antes do loop.
Tem que sentar em cada certidão que está dentro da lista.
Posta o código onde você salva o cartório e/ou as certidões.
1 curtida
Acredito que seria algo mais ou menos assim:
Cartorio cartorio = new Cartorio();
BeanUtils.copyProperties(dto, cartorio);
for (Certidao certidao : cartorio.getCertidoes()) {
certidao.setCartorio(cartorio);
}
1 curtida
ficou desta forma:
@Service
public class CartorioService {
@Autowired
private CartorioRepository cartorioRepository;
@Transactional(readOnly = true)
public CartorioDTO findById(Long id) throws Exception {
Optional<Cartorio> obj = cartorioRepository.findById(id);
Cartorio entity = obj.orElseThrow(() -> new Exception("Cartório não localizado"));
return new CartorioDTO(entity);
}
public List<CartorioDTO> findAll(){
return cartorioRepository.findAll().stream().map(x -> new CartorioDTO(x)).collect(Collectors.toList());
}
@Transactional
public CartorioDTO insert(CartorioDTO dto) throws Exception {
Cartorio entity = new Cartorio();
BeanUtils.copyProperties(dto, entity);
for (Certidao certidao : entity.getCertidoes()) {
certidao.setCartorio(entity);
}
Cartorio cartorio = cartorioRepository.verificarCartorio(dto.getNome(), dto.getEndereco());
if (cartorio == null) {
entity = cartorioRepository.save(entity);
}
else {
throw new Exception("Nome do Cartório ou Endereço já cadastrado!");
}
return new CartorioDTO(entity);
}
@Transactional
public CartorioDTO update(Long id, CartorioDTO dto) throws Exception {
try {
Cartorio entity = cartorioRepository.getOne(id);
BeanUtils.copyProperties(dto, entity, "id");
entity = cartorioRepository.save(entity);
return new CartorioDTO(entity);
}
catch (EntityNotFoundException e) {
throw new Exception("Id not found " + id);
}
}
public void delete(Long id) throws Exception {
try {
cartorioRepository.deleteById(id);
}
catch (EmptyResultDataAccessException e) {
throw new Exception("Id not found " + id);
}
}
porém ainda não deu certo
Você acabou de criar esse cartório, ele não tem certidões.
Seu dto possui uma lista de certidões que está sendo copiada para a entidade?
1 curtida
Pesquisando aqui, parece que o BeanUtils.copyProperties
não atua sobre propriedades que são listas do objeto a ser copiado. Deve ser por isso que não está dando certo.
está desta forma:
public class CartorioDTO implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
private String nome;
private String endereco;
private List<Certidao> certidoes;
public CartorioDTO() {
}
public CartorioDTO(Long id, String nome, String endereco, List<Certidao> certidoes) {
this.id = id;
this.nome = nome;
this.endereco = endereco;
this.certidoes = certidoes;
}
public CartorioDTO(Cartorio entity) {
id = entity.getId();
nome = entity.getNome();
endereco = entity.getEndereco();
certidoes = entity.getCertidoes();
}
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 getEndereco() {
return endereco;
}
public void setEndereco(String endereco) {
this.endereco = endereco;
}
public List<Certidao> getCertidoes() {
return certidoes;
}
public void setCertidoes(List<Certidao> certidoes) {
this.certidoes = certidoes;
}
entao talvez tenha que ser setado manualmente…
1 curtida
no caso, estou testando assim:
{
"nome": "222ssss aa",
"endereco": "a1ss2ss21a",
"certidoes": [
{"nome": "ABC" },
{"nome" : "XYZ"}
]
}
já inserindo o cartório e certidão
Mas estranho, pq, de acordo com o retorno, a cópia da lista estaria funcionando. Tenta rodar em modo debug e veja como está o objeto após a cópia.
Engraçado que pra mim, sempre foi muito comum fazer esse tipo de de-para na mão. Raramente faço uso de algum lib para isso.
1 curtida
Lucas, mt obrigado!!
Fazendo desta forma deu certo. Oq estava gerando o erro, é que precisei colocar a anotação @JsonIgnore em private Cartorio cartorio;, ficando desta forma:
@ManyToOne(fetch = FetchType.LAZY)
@JsonIgnore
private Cartorio cartorio;
isso na classe Certidao
1 curtida