Como salvar a entidade dentro de uma lista?

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 :confused:

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 :confused:

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 :confused:

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… :confused:

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