Estou desenvolvendo um sistema Java Web e nele tive um relacionamento n:n entre AgendaTriados e Indicacao gerando assim outra entidade no bando de dados chamada triados_indicacao no qual vai ter o id das tabelas mencionadas anteriormente. Meu problema é que quando tento excluir essa agenda depois de salvar alguns dados com mesmos procedimentos acusa que não pode por está usando o nome dos procedimentos em outra tabela
Class AgendaTriados
@Entity
@Table(name = "agenda_triados")
public class AgendaTriados implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
private String observacao;
private Date dataAtendimento;
private Aluno aluno;
private Aluno aluno2;
private Disciplina disciplina;
private AgendaMarcacao agenda_marcacao;
private List<Indicacao> indicacoes = new ArrayList<>();
@Id
@GeneratedValue
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@Column(columnDefinition = "text")
public String getObservacao() {
return observacao;
}
public void setObservacao(String observacao) {
this.observacao = observacao;
}
@NotNull
@Column(name = "data_atendimento")
@Temporal(TemporalType.DATE)
public Date getDataAtendimento() {
return dataAtendimento;
}
public void setDataAtendimento(Date dataAtendimento) {
this.dataAtendimento = dataAtendimento;
}
@NotNull
@ManyToOne
@JoinColumn(name = "id_aluno")
public Aluno getAluno() {
return aluno;
}
public void setAluno(Aluno aluno) {
this.aluno = aluno;
}
@NotNull
@ManyToOne
@JoinColumn(name = "id_aluno2")
public Aluno getAluno2() {
return aluno2;
}
public void setAluno2(Aluno aluno2) {
this.aluno2 = aluno2;
}
@NotNull
@ManyToOne
@JoinColumn(name = "id_disciplina")
public Disciplina getDisciplina() {
return disciplina;
}
public void setDisciplina(Disciplina disciplina) {
this.disciplina = disciplina;
}
@NotNull
@ManyToOne(cascade = { CascadeType.PERSIST, CascadeType.MERGE })
@JoinColumn(name = "id_agenda_marcacao")
public AgendaMarcacao getAgenda_marcacao() {
return agenda_marcacao;
}
public void setAgenda_marcacao(AgendaMarcacao agenda_marcacao) {
this.agenda_marcacao = agenda_marcacao;
}
@NotNull
@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = "triado_indicacao", joinColumns = @JoinColumn(name = "agenda_triados_id"),
inverseJoinColumns = @JoinColumn(name = "indicacao_id"))
public List<Indicacao> getIndicacoes() {
return indicacoes;
}
public void setIndicacoes(List<Indicacao> indicacoes) {
this.indicacoes = indicacoes;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((id == null) ? 0 : id.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
AgendaTriados other = (AgendaTriados) obj;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
return true;
}
public void completarCampo() {
Disciplina disciplina = new Disciplina();
AgendaTriados triado = new AgendaTriados();
triado.setDisciplina(disciplina);
}
}
Class Indicacao
@Entity
@Table(name = "indicacao")
public class Indicacao implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
private String nome;
@Id
@GeneratedValue
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@Column(nullable = false)
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((id == null) ? 0 : id.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Indicacao other = (Indicacao) obj;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
return true;
}
@Override
public String toString() {
return nome;
}
}
Bean
@Named
@ViewScoped
public class PesquisaAgendaTriadosBean implements Serializable {
private static final long serialVersionUID = 1L;
private AgendaTriadosFilter filtro;
private AgendaTriados triadoSelecionada;
private List<AgendaTriados> agendaFiltrados;
@Inject
private Triados triados;
public void excluir() {
triados.remover(triadoSelecionada);
agendaFiltrados.remove(triadoSelecionada);
FacesUtil.addInfoMessage("Agenda excluída com sucesso.");
}
//getts e setts
}
Repostory
public class Triados implements Serializable {
private static final long serialVersionUID = 1L;
@Inject
private EntityManager manager;
public AgendaTriados guardar(AgendaTriados triado) {
return manager.merge(triado);
}
@Transactional
public void remover(AgendaTriados triado) {
try {
triado = porId(triado.getId());
manager.remove(triado);
manager.flush();
} catch (PersistenceException e) {
throw new NegocioException("A agenda não pode ser excluída.");
}
}
public AgendaTriados porId(Long id) {
return manager.find(AgendaTriados.class, id);
}
}
A pagina de pesquisa
<ui:define name="titulo">Clínica Odontologica</ui:define>
<ui:define name="corpo">
<h:form id="frmPesquisa">
<h1>Pesquisar Agenda Triados</h1>
<p:messages autoUpdate="true" closable="true" />
<p:toolbar style="margin-top: 20px">
<p:toolbarGroup>
<p:commandButton value="Pesquisar" update="@form" />
</p:toolbarGroup>
<p:toolbarGroup align="right">
<p:button value="Novo" outcome="/triados/CadastroTriados" />
</p:toolbarGroup>
</p:toolbar>
<p:panelGrid columns="4" id="painel"
style="width: 100%; margin-top: 20px"
columnClasses="rotulo, campo, rotulo, campo">
<p:outputLabel value="Data de Atendimento" />
<h:panelGroup>
<p:calendar size="10" pattern="dd/MM/yyyy" readonlyInput="true"
navigator="false" pages="1" mode="popup" locale="pt"
value="#{pesquisaAgendaTriadosBean.filtro.dataAtenderDe}" />
a
<p:calendar size="10" pattern="dd/MM/yyyy" readonlyInput="true"
navigator="false" pages="1" mode="popup" locale="pt"
value="#{pesquisaAgendaTriadosBean.filtro.dataAtenderAte}" />
</h:panelGroup>
<p:outputLabel value="Disciplina" />
<p:inputText size="20"
value="#{pesquisaAgendaTriadosBean.filtro.nomeDisc}" />
<p:outputLabel value="Prática" />
<p:selectManyCheckbox
value="#{pesquisaAgendaTriadosBean.filtro.praticas}">
<f:selectItems value="#{pesquisaAgendaTriadosBean.praticas}"
var="pratica" itemValue="#{pratica}"
itemLabel="#{pratica.descricao}" />
</p:selectManyCheckbox>
<p:outputLabel value="Turno" />
<p:selectManyCheckbox
value="#{pesquisaAgendaTriadosBean.filtro.turnos}">
<f:selectItems value="#{pesquisaAgendaTriadosBean.turnos}"
var="turno" itemValue="#{turno}" itemLabel="#{turno.descricao}" />
</p:selectManyCheckbox>
<p:outputLabel value="Indicação de Procedimento" />
<p:selectManyCheckbox
value="#{pesquisaAgendaTriadosBean.filtro.indicacoes}">
<f:selectItems value="#{cadastroAgendaTriadosBean.indicacoes}"
var="indicacao" itemValue="#{indicacao}"
itemLabel="#{indicacao.nome}" />
</p:selectManyCheckbox>
<p:outputLabel value="Código da Disciplina" />
<p:inputText size="20"
value="#{pesquisaAgendaTriadosBean.filtro.codigo}" />
</p:panelGrid>
<p:dataTable id="triadoTable"
value="#{pesquisaAgendaTriadosBean.model}" var="triado" lazy="true"
style="margin-top: 20px" emptyMessage="Nenhuma agenda marcada."
border="1" cellspacing="0" paginator="true"
paginatorPosition="bottom" rows="5" rowsPerPageTemplate="5,10,15">
<p:column headerText="Atendimento"
style="text-align: center; width: 70px">
<h:outputText value="#{triado.dataAtendimento}">
<f:convertDateTime pattern="dd/MM/yyyy" />
</h:outputText>
</p:column>
<p:column headerText="Paciente"
style="width: 120px; text-align:center">
<h:outputText
value="#{triado.agenda_marcacao.lista_espera.paciente.nome}" />
</p:column>
<p:column headerText="Procedimentos"
style="width: 150px; text-align:center">
<h:outputText value="#{triado.indicacoes}" />
</p:column>
<p:column headerText="Alunos"
style="text-align: center; width: 200px">
#{triado.aluno.nome} e #{triado.aluno2.nome}
</p:column>
<p:column headerText="Disciplina"
style="text-align: center; width: 120px">
<h:outputText value="#{triado.disciplina.nome}" />
</p:column>
<p:column headerText="Turno" style="text-align: center; width: 60px">
<h:outputText value="#{triado.disciplina.turno.descricao}" />
</p:column>
<p:column headerText="Prática"
style="text-align: center; width: 40px">
<h:outputText value="#{triado.disciplina.pratica.descricao}" />
</p:column>
<p:column style="width:60px; text-align: center">
<p:button outcome="/triados/CadastroTriados" icon="ui-icon-pencil"
title="Editar" styleClass="botaoPesquisa">
<f:param name="triado" value="#{triado.id}" />
</p:button>
<p:commandButton icon="ui-icon-trash" title="Excluir"
styleClass="botaoPesquisa" immediate="true"
oncomplete="PF('confirmacaoExclusao').show()" process="@this"
update=":frmPesquisa:confirmacaoExclusaoDialog">
<f:setPropertyActionListener value="#{triado}"
target="#{pesquisaAgendaTriadosBean.triadoSelecionada}" />
</p:commandButton>
</p:column>
</p:dataTable>
<p:confirmDialog header="Exclusão da agenda"
message="Tem certeza que deseja excluir essa agenda?"
widgetVar="confirmacaoExclusao" id="confirmacaoExclusaoDialog">
<p:button value="Não" styleClass="botaoPesquisa"
onclick="PF('confirmacaoExclusao').hide(); return false;" />
<p:commandButton value="Sim" styleClass="botaoPesquisa"
oncomplete="PF('confirmacaoExclusao').hide();"
action="#{pesquisaAgendaTriadosBean.excluir}" process="@this"
update=":frmPesquisa:triadoTable" />
</p:confirmDialog>
</h:form>
</ui:define>
</ui:composition>