Bom dia galera. Gostaria de saber com a melhor maneira de manipular o componente do primefaces <p:selectBooleanCheckbox>
junto com uma lista no back-end. Primeiramente gostaria de saber se é possível essa relação e se é viável.
A problema que estou enfrentando é: Tenho duas entidades/Classes, são elas: Praga e Inspeção. Preciso desenvolver a parte de persistencia da Inspecao, onde toda inspeção pode vir com TODAS ou ALGUMAS ou NENHUMA praga. Então pensei em criar um atributo do tipo List<Praga>
na classe Inspecao. E na parte do formulário, queria fazer uma tela com todas as pragas listadas acompanhadas de uma checkbox e quando este for clicado (true) eu adicionaria a praga referente ao checkbox no atributo List da classe Inspecao. Tentei pensar numa lógica mas travei.
consegui ser claro ? espero que sim.
Segue os códigos abaixo:
Classe Inspecao:
@Entity
@SequenceGenerator(name = "INSPECAO_SEQUENCE", sequenceName = "INSPECAO_SEQUENCE",
allocationSize = 1, initialValue = 0)
@Table(name = "inspecao")
public class Inspecao implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "INSPECAO_SEQUENCE")
private Long id;
@Column(name = "numero_inspecao")
private Long numInspecao;
@ManyToOne
@JoinColumn(name = "talhao_inspecionado", nullable = false)
private Talhao talhaoInspecionado;
@Column(name = "porcentagem_a_visar", nullable = false)
private double porcentagemAvisar;
@Column(name = "data_inspecao", nullable = false)
@Type(type = "com.delago.matta.type.LocalDateUserType")
private LocalDate dataInspecao;
@ManyToOne
@JoinColumn(name = "inspetor", nullable = false)
private Funcionario inspetorResponsavel;
@OneToMany(mappedBy = "inspecao")
@OrderBy("id")
private List<Praga> pragaEncontradas; //essa é o atributo List que deve receber as pragas com o valor do checkbox true
@Column(name = "planta_novas_infectadas")
private boolean plantasNovas;
@Column(name = "qntdMaisElevado_plantasNovas")
private Integer qntdMaisElevadaNovas;
@Column(name = "qntdTotal_plantasNovas")
private Integer qntdTotalNovas;
@Column(name = "plantas_velhas_infectadas")
private boolean plantasVelhas;
@Column(name = "qntdMaisElevado_plantasVelhas")
private Integer qntdMaisElevadaVelhas;
@Column(name = "qntdTotal_plantasVelhas")
private Integer qntdTotalVelhas;
//gets e sets omitidos
Classe Praga:
@Entity
@SequenceGenerator(name = "PRAGA_SEQUENCE", sequenceName = "PRAGA_SEQUENCE",
allocationSize = 1, initialValue = 0)
@Table(name = "praga")
public class Praga implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "PRAGA_SEQUENCE")
private Long id;
@Column(name = "nome", nullable = false)
private String nome;
@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name = "intervalo_baixo")
private Intervalo intervaloBaixo;
@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name = "intervalo_medio")
private Intervalo intervaloMedio;
@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name = "intervalo_alto")
private Intervalo intervaloAlto;
@ManyToOne
private Inspecao inspecao;
Tentativa da tela para lançamento da inspeção: Omiti alguns campos pra encurtar o código:
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:p="http://primefaces.org/ui" template="../main.xhtml">
<ui:define name="content">
<div style="width: fit-content;">
<h:form id="fmCadIspecao">
<p:focus />
<div style="margin: 0 auto; width: fit-content;">
<h2>Lançamento de Inspeção</h2>
</div>
<!--Cadastro de Inspeção-->
<p:panelGrid>
<!--Checkbox para a Praga 1 (Leprose) junto com campos para inserir informações sobre a praga-->
<p:row>
<p:column colspan="8">
<p:selectBooleanCheckbox id="boolCheckLeprose" required="#{param['fmCadIspecao:btnConfirm']==false}"
value="Leprose" >
<f:ajax render="novas"/>
</p:selectBooleanCheckbox>
<p:spacer width="6"/>
<p:outputLabel value="Leprose" for="boolCheckLeprose" />
<br/>
<p:selectBooleanCheckbox id="novas" required="#{param['fmCadIspecao:btnConfirm']==false}"
value="#{inspecaoController.inspecao.plantasNovas}" />
<p:spacer width="6"/>
<p:outputLabel value="Plantas Novas >>" for="novas"/>
<p:spacer width="10"/>
<p:outputLabel id="qtdElevadoNova" value="Qtde. + elevado: " for="qtdMaisElevadoNova"/>
<p:inputText id="qtdMaisElevadoNova" value="#{inspecaoController.inspecao.qntdMaisElevadaNovas}" style="width: 60px;"/>
<p:spacer width="5"/>
<p:outputLabel id="qtdTotalNova" value="Qtde. Total: " for="qtdTotalNovas"/>
<p:inputText id="qtdTotalNovas" value="#{inspecaoController.inspecao.qntdTotalNovas}" style="width: 60px;"/>
<br/>
<p:selectBooleanCheckbox id="velhas" required="#{param['fmCadIspecao:btnConfirm']==false}"
value="#{inspecaoController.inspecao.plantasVelhas}" />
<p:spacer width="6"/>
<p:outputLabel value="Plantas Velhas >>" for="velhas"/>
<p:spacer width="8"/>
<p:outputLabel id="qtdElevadoVelhas" value="Qtde. + elevado: " for="qtdMaisElevadoVelhas"/>
<p:inputText id="qtdMaisElevadoVelhas" value="#{inspecaoController.inspecao.qntdMaisElevadaVelhas}" style="width: 60px;"/>
<p:spacer width="5"/>
<p:outputLabel id="qtdTotal" value="Qtde. Total: " for="qtdTotalVelhas"/>
<p:inputText id="qtdTotalVelhas" value="#{inspecaoController.inspecao.qntdTotalVelhas}" style="width: 60px;"/>
<!--Iria repetir todo o código acima para todas as pragas e adicionar as que foram checkadas
no atributo list d Classe Inspecao-->
<br/>
<p:outputLabel value="Estágios encontrados:"/>
<p:selectManyCheckbox value="#{inspecaoController.inspecao.estagiosEncontrados}" layout="grid" columns="4">
<f:selectItems value="#{inspecaoController.estagiosExistentes}" var="#{e}" itemLabel="#{e}" itemValue="#{e}"/>
<p:spacer width="5"/>
</p:selectManyCheckbox>
</p:column>
</p:row>
</p:panelGrid>
<div style="margin: 0 auto; width: fit-content;">
<p:commandButton id="btnConfirm" class="btn btn-success btn-md" value="Cadastrar" icon="fa fa-check" action="#{inspecaoController.salvar()}" ajax="false"/>
<p:commandButton id="btnCancel" class="btn btn-danger btn-md" value="Cancelar" icon="fa fa-ban" action="#{inspecaoController.cancelar()}" />
</div>
</h:form>
</div>
</ui:define>
</ui:composition>