Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

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;
    }