Atualização dos itens de um pedido

2 respostas
V

Pessoal,

Tenho um form SWING contendo um JTable para os itens.

Ao confirmar as alterações de um pedido, preciso comparar o array que resultou das operações no JTable (inclusão, alteraçã e exclusão de itens) com o que há dentro da base de dados.

Qual a maneira mais elegante de realizar este procedimento ?

Estou usando Hibernate com Java DB embarcado, com as classes PedidoVenda e ItemPedido relacionadas da seguinte forma:

@Entity
@Table(name = "pedidovenda")
@SequenceGenerator(name = "pedidovenda_sequencia", sequenceName = "pedidovenda_sequencia_id", allocationSize = 1)
public class PedidoVenda implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY, generator = "pedidovenda_sequencia")
    private Long id;
    @Column(length = 2)
    private String status;
    @Column(length = 2)
    private String filial;
    @Column(length = 6)
    private String numero;
    @Column(length = 20)
    @OneToMany(mappedBy = "pedidovenda", targetEntity = ItemPedido.class, fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    private Collection<ItemPedido> itens;
...
@Entity
@Table(name = "itens")
@SequenceGenerator(name = "itempedidovenda_sequencia", sequenceName = "itempedidovenda_sequencia_id", allocationSize = 1)
public class ItemPedido implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY, generator = "itempedidovenda_sequencia")
    private Long id;
    @Column(length = 2)
    private String item;
    @ManyToOne
    @JoinColumn(name = "id_pedidovenda")
    private PedidoVenda pedidovenda;
...

2 Respostas

V

você poderia posta um exemplo de como vai ser comparado, como vem os dados no primeiro array, e como vem os dados no segundo array, isso vai ajudar um pouco

V

Os arrays são de objetos.

Estou fazendo da seguinte forma:
Os dados são gravados sem problema. Mas ocorre o seguinte erro visualizado no console (ver erro no final). Se eu comento a linha ipDAO.excluirItensPedido(pv); o erro não acontece, contudo grava de forma indevida os itens.

public class PedidoVendaDAO extends GenericDAO<PedidoVenda> {

    private Utils utils = new Utils();

    public void salvarOuAtualizar(PedidoVenda pv) {

        ItemPedidoDAO ipDAO = new ItemPedidoDAO();
        
        if (pv.getId() != null){
            ipDAO.excluirItensPedido(pv);            
        }
        saveOrUpdate(pv);
        
        ItemPedido item;
        Iterator lista = pv.getItens().iterator();
        while (lista.hasNext()) {
            item = (ItemPedido) lista.next();
            item.setPedidovenda(pv);
            ipDAO.save(item);
        }
    }
...
public class ItemPedidoDAO extends GenericDAO<ItemPedido> {
    public void excluirItensPedido(PedidoVenda pv) {
        List<ItemPedido> itens = ListaCondicional01("pedidovenda", pv, false, false);
        for (int i = 0; i < itens.size(); i++){
            delete(itens.get(i));
        }
    }
}
...
public class GenericDAO<T extends Serializable> {

    private Session sessao;
    private final Class<T> classePersistente;

    public GenericDAO() {
        this.classePersistente = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
    }

    /**
     * Caso o id do objeto já exista na base de dados, ocorrerá o update. Caso
     * contrário, o insert.
     *
     * @param entity
     */
    protected void saveOrUpdate(T entity) {
        this.sessao = HibernateUtil.getSession();
        try {
            this.sessao.beginTransaction();
            this.sessao.saveOrUpdate(entity);
            this.sessao.getTransaction().commit();  //O ERRO ABAIXO ESTÁ APONTANDO PARA ESTA LINHA
        } catch (Throwable t) {
            this.sessao.getTransaction().rollback();
            t.printStackTrace();
        } finally {
            fecharSessao();
        }
    }

    /**
     * retorna os registros que atendam as restrições passadas pelos parâmetros
     *
     * @param cCampo - campo que haverão filtragem.
     * @param cConteudo - conteúdo para os campos de cCampo.
     * @param cLike - informa se a consulta do campo em cCampo será por
     * igualdade ou like.
     * @param filtraPorVendedor - informa se deverá filtrar os dados pelo
     * id_vendedor, que não necessita estar em cCampo.
     * @return
     */
    public List<T> ListaCondicional01(String cCampo, Object cConteudo, Boolean cLike, Boolean filtraPorVendedor) {
        this.sessao = HibernateUtil.getSession();
        this.sessao.beginTransaction();
        Criteria criteria = this.sessao.createCriteria(classePersistente);
        List<T> aResultado;

        if (filtraPorVendedor) {
            criteria.add(Restrictions.eq("id_vendedor", Acesso.getInstancia().getCodigo()));
        }

        if (cLike) {
            criteria.add(Restrictions.like(cCampo.toString(), "%" + cConteudo.toString() + "%").ignoreCase());
        } else {
            if (cConteudo instanceof String) {
                criteria.add(Restrictions.eq(cCampo.toString(), cConteudo.toString()).ignoreCase());
            }else{
                criteria.add(Restrictions.eq(cCampo.toString(), cConteudo));
            }
        }
        aResultado = (ArrayList<T>) criteria.list();
        this.sessao.getTransaction().commit();
        fecharSessao();
        return aResultado;
    }
...
Jul 09, 2013 9:17:31 AM org.hibernate.engine.jdbc.batch.internal.AbstractBatchImpl release
INFO: HHH000010: On release of batch it still contained JDBC statements
org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1
	at org.hibernate.jdbc.Expectations$BasicExpectation.checkBatched(Expectations.java:81)
	at org.hibernate.jdbc.Expectations$BasicExpectation.verifyOutcome(Expectations.java:73)
	at org.hibernate.engine.jdbc.batch.internal.NonBatchingBatch.addToBatch(NonBatchingBatch.java:59)
	at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:3224)
	at org.hibernate.persister.entity.AbstractEntityPersister.updateOrInsert(AbstractEntityPersister.java:3126)
	at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:3456)
	at org.hibernate.action.internal.EntityUpdateAction.execute(EntityUpdateAction.java:140)
	at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:377)
	at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:369)
	at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:287)
	at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:339)
	at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:52)
	at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1234)
	at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:404)
	at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.beforeTransactionCommit(JdbcTransaction.java:101)
	at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:175)
	at com.tfv.dao.GenericDAO.saveOrUpdate(GenericDAO.java:37)
	at com.tfv.dao.PedidoVendaDAO.salvarOuAtualizar(PedidoVendaDAO.java:29)
	at com.tfv.controller.PedidoVendaController.salvarOuAtualizar(PedidoVendaController.java:57)
	at com.tfv.view.PedidoVendaCadastro.btnGravarActionPerformed(PedidoVendaCadastro.java:1290)
	at com.tfv.view.PedidoVendaCadastro.access$2500(PedidoVendaCadastro.java:28)
	at com.tfv.view.PedidoVendaCadastro$18.actionPerformed(PedidoVendaCadastro.java:774)
	at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
	at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
	at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
Criado 8 de julho de 2013
Ultima resposta 9 de jul. de 2013
Respostas 2
Participantes 2