Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Seta novo valor de um objeto em outro objeto @ManyToMany

Olá. Existe a possibilidade de setar um valor de uma propriedade de um objeto para um outro objeto cujo relacionamento é @ManyToMany . Exemplo:

MinhasReceitas tem MinhasContas.
@ManyToMany 

valor = "Conta X";
receitas.setMinhasContas(valor); // Obviamente da o erro pois espera uma lista

assim, persiste, mas periste todas as contas para um receita, uma lista inteira para uma receita apenas, enquanto preciso setar apenas "Conta X":
List<MinhasContas> listMc = contasService.findAll();
for(MinhasContas mc : listMc){
    receitas.setMinhasContas(listMc);
}

Como posso fazer para setar o valor "Conta X" para essa receita? Ou tem alguma rotina para isso?

4 respostas

Boa noite Clerman beleza? Poderia postar as classes MinhasReceitas e MinhasContas?

Valeu!

Olá Márcio boa noite! Segue Classe MinhasReceitas

@Entity
@Table(name = "minhas_receitas")
@JsonIgnoreProperties(value = { "new" })
public class MinhasReceitas extends AbstractPersistable<Long> {

    @Column(name = "descricao_receita", nullable = true)
    private String descricaoReceita;

    @Column(name = "data_receita", nullable = true)
    @DateTimeFormat(pattern = "dd/MM/yyyy", iso = ISO.DATE)
    private LocalDate dataReceita;

    @Column(name = "valor_receita", nullable = true)
    @NumberFormat(style = Style.CURRENCY, pattern = "###,##0.00")
    private BigDecimal valorReceita;

    @Column(name = "receita_fixa", nullable = true)
    private boolean receitaFixa;

    @Column(name = "receita_fixa_quantidade", nullable = true)
    private Integer receitaFixaQuantidade;

    @Enumerated(EnumType.STRING)
    @Column(name = "receita_fixa_tempo", nullable = true)
    private ReceitaFixaTempo receitaFixaTempo;

    @Column(name = "repetir_lanc", nullable = true)
    private boolean repetirLancReceita;

    @Enumerated(EnumType.STRING)
    @Column(name = "repetir_por_periodo", nullable = true)
    private RepetirPorPeriodo repetirPorPeriodo;

    @Column(name = "pagamento", nullable = true)
    private boolean pagamento;

    @Column(name = "adicionar_observacao", nullable = true)
    private String addObservacao;

    @ManyToMany(fetch = FetchType.EAGER)
    @JoinTable(name = "categorias_has_receitas", joinColumns = @JoinColumn(name = "receitas_cat_id"), inverseJoinColumns = @JoinColumn(name = "categoria_id"))
    private List<CatTipoReceitas> tipoReceitas;

    @ManyToMany(fetch = FetchType.EAGER)
    @JoinTable(name = "contas_has_receitas", joinColumns = @JoinColumn(name = "receitas_id"), inverseJoinColumns = @JoinColumn(name = "contas_id"))
    private List<MinhasContas> minhasContas;

    @ManyToMany(fetch = FetchType.EAGER)
    @JoinTable(name = "etiquetas_has_receitas", joinColumns = @JoinColumn(name = "receitas_id"), inverseJoinColumns = @JoinColumn(name = "etiquetas_id"))
    private List<Etiquetas> etiquetas;

    @Column(name = "cor")
    private String cor;
    // Getters and Setters
}

MinhasContas:

@Entity
@Table(name = "minhas_contas")
@JsonIgnoreProperties(value = {"minhasReceitas", "transferencias", "new"})
public class MinhasContas extends AbstractPersistable<Long> {

    // @Length(min = 3, max = 30)
    @Column(nullable = false, unique = true, length = 30)
    private String nome;

    @Column(nullable = true)
    @DateTimeFormat(pattern = "dd/MM/yyyy HH:mm:ss", iso = ISO.DATE_TIME)
    private LocalDate dataAcesso;

    @Column(nullable = false)
    @NumberFormat(style = Style.CURRENCY, pattern = ("###,##0.00"))
    private BigDecimal saldoAnterior;

    @Column(nullable = false)
    @NumberFormat(style = Style.CURRENCY, pattern = ("###,##0.00"))
    private BigDecimal saldoAtual;

    @Column(nullable = true)
    @NumberFormat(style = Style.CURRENCY, pattern = ("###,##0.00"))
    private BigDecimal saldoFinal;

    @Enumerated(EnumType.STRING)
    @Column(nullable = true)
    private CatTipoConta tipo;

    @Column(nullable = true)
    private String cor;

    @Column(nullable = true)
    private Boolean dashBoard;

    @ManyToMany//(cascade = CascadeType.REMOVE)
    @JoinTable(name = "contas_has_receitas", joinColumns = @JoinColumn(name = "contas_id"), inverseJoinColumns = @JoinColumn(name = "receitas_id"))
    private List<MinhasReceitas> minhasReceitas;

    @ManyToMany
    @JoinTable(name = "contas_has_transfer", joinColumns = @JoinColumn(name = "contas_id"), inverseJoinColumns = @JoinColumn(name = "transfer_id"))
    private List<Transferencias> transferencias;

    // Getters and Setters
}
solução!

O que vc precisa fazer é de alguma forma recuperar esse objeto, por exemplo dando um dao.findOne(id), no caso um objeto receita, fazer um receita.setValor("Conta X") e fazer o update com dao.update/merge

Isso alteraria o valor daquela receita especifica, assim toda lista que contiver aquele objeto especifico tera o valor atualizado.

De toda forma vc precisaria identificar o objeto q vc quer alterar, outro jeito, usando no caso seu foreach seria assim:

for(MinhasContas mc : listMc){
if(mc.getId == (algum id)){
    mc.setValor("Conta X");
    receitas.setMinhasContas(listMc);
}
}

Era isso? Se eu tiver entendido errado por favor me corrija que eu tentarei te ajudar de outra forma.

Valeu!

Bom dia Mário. Consegui fazer aqui , sua resposta me deu uma ideia do que eu poderia fazer:

List<MinhasContas> listMc = contasService.findByNome(valor);
        for(MinhasContas mc : listMc){
                if (valor != null && !valor.isEmpty()) {
                 receitas.setMinhasContas(listMc);
        }
}

Obrigado pela ajuda super rápida!