13
respostas

erro novamente ao modelar classes.

Na boa mesmo, eu vou evitar em usar relação biredicional, é só erro, cada vez é um erro que não consigo resolver!!!

@Table
@Entity
@NamedQueries({ @NamedQuery(name = "Produto.listaTodos", query = "Select p from Produto p join fetch p.fornecedores") })
public class Produto implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column
    private Long codigo;

    @Column(length = 40, nullable = false)
    private String descricao;

    @Column
    private Integer quantidade;

    @Column
    private Double preco;

@OneToMany(mappedBy = "produto", targetEntity = Produto.class, fetch = FetchType.LAZY)
    private List<Fornecedor> fornecedores = new ArrayList<Fornecedor>();
@Table
@Entity
public class Fornecedor implements Serializable{

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column
    private Long codigo;

    @Column(length = 50, nullable = false)
    private String nome;

    @Column
    private String celular;

    @ManyToOne
    @JoinColumn(name = "produto_codigo")
    private Produto produto = new Produto();

Erro ao rodar.

GRAVE: Servlet.service() for servlet [Faces Servlet] in context with path [/tcc] threw exception [Error while committing the transaction] with root cause
com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot delete or update a parent row: a foreign key constraint fails (`tcc`.`fornecedor`, CONSTRAINT `FKC4F07D8598B180FE` FOREIGN KEY (`codigo`) REFERENCES `produto` (`codigo`))
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
    at com.mysql.jdbc.Util.getInstance(Util.java:386)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1040)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4096)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4028)
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2490)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2651)
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2734)
    at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2155)
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2458)
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2375)
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2359)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation(AbstractStatementProxyHandler.java:122)
    at org.hibernate.engine.jdbc.internal.proxy.AbstractProxyHandler.invoke(AbstractProxyHandler.java:81)
    at com.sun.proxy.$Proxy32.executeUpdate(Unknown Source)
    at org.hibernate.engine.jdbc.batch.internal.NonBatchingBatch.addToBatch(NonBatchingBatch.java:56)
    at org.hibernate.persister.entity.AbstractEntityPersister.delete(AbstractEntityPersister.java:3303)
    at org.hibernate.persister.entity.AbstractEntityPersister.delete(AbstractEntityPersister.java:3506)
    at org.hibernate.action.internal.EntityDeleteAction.execute(EntityDeleteAction.java:100)
    at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:362)
    at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:354)
    at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:280)
    at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:326)
    at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:52)
    at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1213)
    at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:402)
    at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.beforeTransactionCommit(JdbcTransaction.java:101)
    at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:175)
    at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:75)
    at br.com.bercalini.dao.ProdutoDao.remover(ProdutoDao.java:49)
    at br.com.bercalini.bean.ProdutoBean.remover(ProdutoBean.java:49)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at javax.el.BeanELResolver.invoke(BeanELResolver.java:476)
    at javax.el.CompositeELResolver.invoke(CompositeELResolver.java:161)
    at org.apache.el.parser.AstValue.getValue(AstValue.java:173)
    at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:185)
    at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:109)
    at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:194)
    at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:182)
    at javax.faces.component.UICommand.getValue(UICommand.java:218)
    at org.primefaces.component.commandbutton.CommandButtonRenderer.encodeMarkup(CommandButtonRenderer.java:63)
    at org.primefaces.component.commandbutton.CommandButtonRenderer.encodeEnd(CommandButtonRenderer.java:54)
    at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:920)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1863)
    at org.primefaces.component.panelgrid.PanelGridRenderer.encodeDynamicBody(PanelGridRenderer.java:131)
    at org.primefaces.component.panelgrid.PanelGridRenderer.encodeTableBody(PanelGridRenderer.java:102)
    at org.primefaces.component.panelgrid.PanelGridRenderer.encodeTableLayout(PanelGridRenderer.java:65)
    at org.primefaces.component.panelgrid.PanelGridRenderer.encodeEnd(PanelGridRenderer.java:37)
    at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:920)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1863)
    at org.primefaces.component.column.Column.renderChildren(Column.java:352)
    at org.primefaces.component.datatable.DataTableRenderer.encodeCell(DataTableRenderer.java:1051)
    at org.primefaces.component.datatable.DataTableRenderer.encodeRow(DataTableRenderer.java:999)
    at org.primefaces.component.datatable.DataTableRenderer.encodeRows(DataTableRenderer.java:907)
    at org.primefaces.component.datatable.DataTableRenderer.encodeTbody(DataTableRenderer.java:854)
    at org.primefaces.component.datatable.DataTableRenderer.encodeTbody(DataTableRenderer.java:814)
    at org.primefaces.component.datatable.DataTableRenderer.encodeRegularTable(DataTableRenderer.java:290)
    at org.primefaces.component.datatable.DataTableRenderer.encodeMarkup(DataTableRenderer.java:252)
    at org.primefaces.component.datatable.DataTableRenderer.encodeEnd(DataTableRenderer.java:87)
    at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:920)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1863)
    at javax.faces.render.Renderer.encodeChildren(Renderer.java:176)
    at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:890)
    at org.primefaces.renderkit.CoreRenderer.renderChild(CoreRenderer.java:85)
    at org.primefaces.renderkit.CoreRenderer.renderChildren(CoreRenderer.java:72)
    at org.primefaces.component.layout.LayoutUnitRenderer.encodeEnd(LayoutUnitRenderer.java:49)
    at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:920)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1863)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1859)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1859)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1859)
    at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:458)
    at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:134)
    at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:120)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:219)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:659)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

O erro quer dizer que não to referenciando certo? me ajudem a achar o erro? vo fazer de tudo para sair dessas anotações ManyToOne e OneToMany

13 respostas

Bom dia Alisson, esse erro está acontecendo porque você tem um relacionamento entre duas tabelas e está tentando deletar ou alterar um registro em uma que tem referencia na outra, por exemplo, tempos a tabela filmes e a tabelas generos. Temos o registro 1 - Aventura em genero e 1 - filme 1 - 1(id aventura). Logo estamos usando o registro do genero na tabela de filmes. Se tentarmos apagar o registro Aventura termos o erro que voce teve acima.

E qual seria a solução? poderia me dizer se a modelagem e as anotações estão correta?

Alisson, seu mapeamento está correto e fez sentido o relacionamento bidirecional no seu caso, porém na sua lógica nunca poderá deletar um produto se estiver vinculado a um fornecedor. Então para deletar um produto, primeiro tem que deletar todos que o fornecem.

Teria como uma forma de eu delelar os produtos e deletarem os fornecedores?

Teria sim, utilizando cascade, passando a operação da cascata , então na entidade Produto temos:

@OneToMany(mappedBy = "produto",cascade=CascadeType.tipo_da_operacao ,targetEntity = Produto.class, fetch = FetchType.LAZY)

Fiz assim.

    @OneToMany(mappedBy = "produto", targetEntity = Fornecedor.class, fetch = FetchType.LAZY, cascade = CascadeType.REMOVE)
        private List<Fornecedor> fornecedores = new ArrayList<Fornecedor>();

no meu dao. assim

    public void remover(Produto produto, Fornecedor forncedor) {
        EntityManager em = new JPAUtil().geEntityManager();
        em.getTransaction().begin();
        produto = em.getReference(Produto.class, produto.getCodigo());
        em.remove(em.merge(produto));
        em.getTransaction().commit();
        em.close();

erro :(

GRAVE: Servlet.service() for servlet [Faces Servlet] in context with path [/tcc] threw exception [Unable to find br.com.bercalini.modelo.Produto with id 13] with root cause javax.persistence.EntityNotFoundException: Unable to find br.com.bercalini.modelo.Produto with id 13

Existe um produto com id 13 na sua base?

Não so existe de 14 para cima, porque ta querendo excluir o 13 sendo que nem existe?

Quando você chama o remove, voce passa o Produto e o Fornecedor, verifica se não está passando um Produto com id = 13

Sabe oque foi estranho agora? eu recarreguei a pagina e excluir um por um do 14 ao 19 mas mesmo assim dando a msg de erro. tava no 13 ai quando recarrguei a pagina, foi para o 14 que existia, e falo que não existia o.o tipo ele ta excluindo e ta falando que não existe o id.

eu to adicionando um produto, e quando entro na pagina para listar os produtos está excluindo automatico um produto

Posso ver seu método de listar? e de adicionar?

public void adicionar(Produto produto, Fornecedor forncedor) {
        EntityManager em = new JPAUtil().geEntityManager();
        em.getTransaction().begin();
        em.persist(produto);
        em.persist(forncedor);
        em.getTransaction().commit();
        em.close();
    }

e o lista

    @SuppressWarnings("unchecked")
    public List<Produto> listaProdutos() {
        EntityManager em = new JPAUtil().geEntityManager();
        List<Produto> resultado = em.createNamedQuery("Produto.listaTodos").getResultList();
        em.close();
        return resultado;
    }