Já tentei de várias formas o relacionamento bidirecional do OneToMany do jpa, mas sem muito sucesso…
bom, o que ocorre é o seguinte, tenho duas classes, Ocorrencia e MaterialApreendido, primeiramente a ocorrência é criada, e depois adiciono os materiais, porém ao adicionar um material e setar a chave estrangeira passando a ocorrência não aparece nenhum erro e mesmo assim a chave estrangeira não é setada. help.
Ocorrência.class
@Entity
@Table(name = "OCORRENCIA")
@NamedQuery(name = "Ocorrencia.buscarOcorrenciaPorIdComMateriais", query = "select o from Ocorrencia o left join fetch o.materiais where o.id_ocorrencia = :id_ocorrencia");
public class Ocorrencia implements Serializable {
private static final long serialVersionUID = 1L;
public static final String BUSCAR_OCORRENCIA_POR_ID_COM_MATERIAIS = "Ocorrencia.buscarOcorrenciaPorIdComMateriais";
//Outros Atributos
@OneToMany(mappedBy = "ocorrencia")
private Set<MaterialApreendido> materiais;
//Getters e Setters
public Set<MaterialApreendido> getMateriais() {
return materiais;
}
public void setMateriais(Set<MaterialApreendido> materiais) {
this.materiais = materiais;
}
}
MaterialApreendido.class
@Entity
@Table(name = "material_apreendido")
public class MaterialApreendido implements Serializable {
private static final long serialVersionUID = 1L;
//Outros Atributos
@JoinColumn(name = "ocorrencia")
@ManyToOne
private Ocorrencia ocorrencia;
//Getters e Setters
public Ocorrencia getOcorrencia() {
return ocorrencia;
}
public void setOcorrencia(Ocorrencia ocorrencia) {
this.ocorrencia = ocorrencia;
}
}
OcorrenciaFacade.class
public class OcorrenciaFacade implements Serializable {
private static final long serialVersionUID = 1L;
OcorrenciaDAO ocorrenciaDAO = new OcorrenciaDAO();
MaterialApreendidoDAO materialDAO = new MaterialApreendidoDAO();
public Ocorrencia buscarOcorrenciaComTodosMateriais(int id_ocorrencia) {
ocorrenciaDAO.beginTransaction();
Ocorrencia ocorrencia = ocorrenciaDAO.buscarOcorrenciaComTodosMateriais(id_ocorrencia);
ocorrenciaDAO.closeTransaction();
return ocorrencia;
}
public void addMaterialParaOcorrencia(int id_material, int id_ocorrencia) {
ocorrenciaDAO.beginTransaction();
materialDAO.joinTransaction();
MaterialApreendido material = new MaterialApreendido();
Ocorrencia ocorrencia = new Ocorrencia();
material = materialDAO.buscar(id_material);
ocorrencia = ocorrenciaDAO.buscar(id_ocorrencia);
material.setOcorrencia(ocorrencia); // NÃO ESTÁ SETANDO
ocorrencia.getMateriais().add(material);
ocorrenciaDAO.commitAndCloseTransaction();
}
public void removerMaterialDaOcorrencia(int id_material, int id_ocorrencia) {
ocorrenciaDAO.beginTransaction();
materialDAO.joinTransaction();
MaterialApreendido material = new MaterialApreendido();
Ocorrencia ocorrencia = new Ocorrencia();
material = materialDAO.buscar(id_material);
ocorrencia = ocorrenciaDAO.buscar(id_ocorrencia);
material.setOcorrencia(null);
ocorrencia.getMateriais().remove(material);
ocorrenciaDAO.commitAndCloseTransaction();
}
//Getters e Setters
public OcorrenciaDAO getOcorrenciaDAO() {
return ocorrenciaDAO;
}
public void setOcorrenciaDAO(OcorrenciaDAO ocorrenciaDAO) {
this.ocorrenciaDAO = ocorrenciaDAO;
}
}
OcorrenciaMB.class
@ViewScoped
@ManagedBean(name = "ocorrenciaMB")
public class OcorrenciaMB extends AbstractMB implements Serializable {
private static final long serialVersionUID = 1L;
private static final String OCORRENCIA_SELECIONADA = "ocorrenciaSelecionada";
private Ocorrencia ocorrencia;
private Ocorrencia ocorrenciaComMateriais;
private MaterialApreendido material;
private OcorrenciaFacade ocorrenciaFacade = new OcorrenciaFacade();
private MaterialApreendidoFacade materialFacade = new MaterialApreendidoFacade();
public void addMaterialParaOcorrencia() {
try {
material = new MaterialApreendido();
material.setId_material(getMaterialFacade().buscarUltimoMaterialCadastrado()); //BUSCA O ULTIMO ID CADASTRADO (SELECT MAX(ma.id_material) FROM material_apreendido ma)
getOcorrenciaFacade().addMaterialParaOcorrencia(material.getId_material(), ocorrenciaComMateriais.getId_ocorrencia());
closeDialog();
displayInfoMessageToUser("Adicionado Com Sucesso");
relistarOcorrenciaComMateriais();
resetarMaterial();
} catch(Exception e){
keepDialogOpen();
displayErrorMessageToUser("Ops, não foi possível criar. Try again later");
e.printStackTrace();
}
}
public void removerMaterialDaOcorrencia() {
try {
getOcorrenciaFacade().removerMaterialDaOcorrencia(material.getId_material(), ocorrenciaComMateriais.getId_ocorrencia());
closeDialog();
displayInfoMessageToUser("Deletado Com Sucesso");
relistarOcorrenciaComMateriais();
resetarMaterial();
} catch(Exception e) {
keepDialogOpen();
displayErrorMessageToUser("Ops, não foi possível criar. Try again later");
e.printStackTrace();
}
}
//PEGA A OCORRÊNCIA SELECIONADA NA TABELA E MUDA PARA A PÁGINA DE ADIÇÃO DE MATERIAIS
public String inserirDadosOcorrencia() {
ELFlash.getFlash().put(OCORRENCIA_SELECIONADA, ocorrencia);
return "/pages/protected/defaultUser/Ocorrencia/inserirDadosOcorrencia/ocorrenciaMateriais?faces-redirect=true";
}
public void relistarOcorrenciaComMateriais() {
ocorrenciaComMateriais = new Ocorrencia();
ocorrenciaComMateriais = getOcorrenciaFacade().buscarOcorrenciaComTodosMateriais(ocorrencia.getId_ocorrencia());
}
public void resetarMaterial() {
material = new MaterialApreendido();
}
//Getters e Setters
public Ocorrencia getOcorrencia() {
if(ocorrencia == null) {
ocorrencia = new Ocorrencia();
}
return ocorrencia;
}
public void setOcorrencia(Ocorrencia ocorrencia) {
this.ocorrencia = ocorrencia;
}
public Ocorrencia getOcorrenciaComMateriais() {
if(ocorrenciaComMateriais == null) {
if(ocorrencia == null) {
ocorrencia = new Ocorrencia();
ocorrencia = (Ocorrencia) ELFlash.getFlash().get(OCORRENCIA_SELECIONADA);
}
ocorrenciaComMateriais = new Ocorrencia();
ocorrenciaComMateriais = getOcorrenciaFacade().buscarOcorrenciaComTodosMateriais(ocorrencia.getId_ocorrencia());
}
return ocorrenciaComMateriais;
}
public void setOcorrenciaComMateriais(Ocorrencia ocorrenciaComMateriais) {
this.ocorrenciaComMateriais = ocorrenciaComMateriais;
}
public MaterialApreendido getMaterial() {
if(material == null) {
material = new MaterialApreendido();
}
return material;
}
public void setMaterial(MaterialApreendido material) {
this.material = material;
}
public OcorrenciaFacade getOcorrenciaFacade() {
if(ocorrenciaFacade == null) {
ocorrenciaFacade = new OcorrenciaFacade();
}
return ocorrenciaFacade;
}
public void setOcorrenciaFacade(OcorrenciaFacade ocorrenciaFacade) {
this.ocorrenciaFacade = ocorrenciaFacade;
}
public MaterialApreendidoFacade getMaterialFacade() {
if(materialFacade == null) {
materialFacade = new MaterialApreendidoFacade();
}
return materialFacade;
}
public void setMaterialFacade(MaterialApreendidoFacade materialFacade) {
this.materialFacade = materialFacade;
}
}
ocorrenciaMateriais.xhtml
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:p="http://primefaces.org/ui">
<h:body>
<ui:composition template="/pages/protected/templates/master.xhtml">
<ui:define name="divMain">
<h:form id="formMateriais">
<h1>Materiais Apreendidos</h1>
<h3>#{bundle.ocorrenciaMateriais}: <h:outputText value="#{ocorrenciaMB.ocorrenciaComMateriais.bo_numero}" /></h3>
<p:commandLink action="/pages/protected/defaultUser/Ocorrencia/ocorrenciasBusca?faces-redirect=true">
<p:graphicImage library="images" name="voltar.png" height="50px" />
</p:commandLink>
<hr/>
<p:dataTable style="font-size: 15px;" id="tabelaMateriais" value="#{ocorrenciaMB.ocorrenciaComMateriais.materiais}" var="material" emptyMessage="#{bundle.semDados}" paginator="true" rows="10"
paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
rowsPerPageTemplate="5,10,15">
<p:column headerText="#{bundle.descricao}">
<h:outputText value="#{material.descricao}" />
</p:column>
<p:column headerText="#{bundle.situação}">
<h:outputText value="#{material.situacao}" />
</p:column>
<p:column headerText="#{bundle.quantidade}" style="width: 10%;">
<h:outputText value="#{material.quantidade}" />
</p:column>
<p:column>
<p:commandButton value="#{bundle.remover}" icon="ui-icon-plus" actionListener="#{ocorrenciaMB.resetarMaterial()}" onclick="PF('dialogRemoverMaterialDaOcorrencia').show();" update=":formDialogRemoverMaterialDaOcorrencia" >
<f:setPropertyActionListener target="#{ocorrenciaMB.material}" value="#{material}" />
</p:commandButton>
<p:spacer width="10px" />
</p:column>
</p:dataTable>
<p:commandButton value="#{bundle.add} #{bundle.material}" icon="ui-icon-plus" onclick="PF('dialogAddMaterialOcorrencia').show();" update=":formDialogAddMaterialOcorrencia" />
</h:form>
<ui:include src="/pages/protected/defaultUser/Ocorrencia/inserirDadosOcorrencia/dialogs/dialogAddMaterialOcorrencia.xhtml" />
<ui:include src="/pages/protected/defaultUser/Ocorrencia/inserirDadosOcorrencia/dialogs/dialogRemoverMaterialDaOcorrencia.xhtml" />
</ui:define>
</ui:composition>
</h:body>
</html>
dialogAddMaterialOcorrencia.xhtml
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:p="http://primefaces.org/ui">
<h:body>
<p:dialog widgetVar="dialogAddMaterialOcorrencia" header="Criar Nova Instrução de Serviço" id="idDialogAddMaterialOcorrencia" width="800" modal="true"
closable="true" draggable="false" resizable="false">
<h:form id="formDialogAddMaterialOcorrencia" prependId="false">
<p:wizard showNavBar="false" widgetVar="wiz">
<p:tab id="dadosM" title="Dados Material">
<br/>
<p:panelGrid styleClass="semBorda" columns="3">
<h:outputLabel for="descMaterial" value="#{bundle.descricao}:" />
<p:inputText id="descMaterial" value="#{materialMB.materialApreendido.descricao}" required="true" label="#{bundle.descricao}" />
<p:message for="descMaterial"/>
<h:outputLabel for="situacao" value="#{bundle.situação}:" />
<p:selectOneMenu id="situacao" value="#{materialMB.materialApreendido.situacao}" required="true" label="#{bundle.situação}" style="width: 150px;">
<f:selectItem itemLabel="...Selecione" itemValue="" noSelectionOption="true" />
<f:selectItem itemLabel="Intacto" itemValue="Intacto" />
<f:selectItem itemLabel="Quebrado" itemValue="Quebrado" />
<f:selectItem itemLabel="Arranhado" itemValue="Arranhado" />
</p:selectOneMenu>
<p:message for="situacao"/>
<h:outputLabel for="quantidade" value="#{bundle.quantidade}:" />
<p:inputText id="quantidade" value="#{materialMB.materialApreendido.quantidade}" required="true" label="#{bundle.quantidade}" />
<p:message for="quantidade"/>
<h:outputLabel for="serie" value="#{bundle.serie}:" />
<p:inputText id="serie" value="#{materialMB.materialApreendido.serie_id}" required="true" label="#{bundle.serie}" />
<p:message for="serie"/>
<h:outputLabel for="info" value="#{bundle.info}:" />
<p:inputText id="info" value="#{materialMB.materialApreendido.info}" required="true" label="#{bundle.info}" />
<p:message for="info"/>
</p:panelGrid>
<br/>
<p:toolbar styleClass="barra">
<p:toolbarGroup>
<p:commandButton value="#{bundle.cancelar}" icon="ui-icon-cancel" onclick="PF('dialogAddMaterialOcorrencia').hide();"
type="button" >
<p:ajax event="click" listener="#{materialMB.resetarMaterial()}" update=":formDialogAddMaterialOcorrencia" />
</p:commandButton>
</p:toolbarGroup>
<p:toolbarGroup align="right">
<p:commandButton value="#{bundle.criar}" icon="ui-icon-plus" actionListener="#{materialMB.criarMaterial()}" -->PRIMEIRO CRIA O MATERIAL DEPOIS ADICIONA NA OCORRÊNCIA
action="#{ocorrenciaMB.addMaterialParaOcorrencia()}" update=":messageGrowl :formMateriais:tabelaMateriais :formDialogAddMaterialOcorrencia"
oncomplete="closeDialogIfSucess(xhr, status, args, PF('dialogAddMaterialOcorrencia'), 'idDialogAddMaterialOcorrencia')" />
</p:toolbarGroup>
</p:toolbar>
</p:tab>
</p:wizard>
</h:form>
</p:dialog>
</h:body>
</html>
Já tentei de tudo, mas sem sucesso, somente o relacionamento unidirecional funciona, porém ele cria uma tabela de junção o que não quero. Desde já agradeço se encontrarem algum erro só falar. vlw!