db4o Developer Community

db4o open source object database, native to Java and .NET
Welcome to db4o Developer Community Sign in | Join
in Search
More Search Options

Chamada a store ignorada

Last post 08-11-2008, 05:58 PM by douglascrp. 0 replies.
Sort Posts: Previous Next
  •  08-11-2008, 05:58 PM 50587

    • douglascrp is not online. Last active: 24/11/2008, 02:32 AM douglascrp
    • Not Ranked
    • Joined on 07-10-2008
    • São Paulo - Brasil
    • Posts 5

    Chamada a store ignorada

    e aí pessoal, blz?

    seguinte... tenho um código meu que utilizo para gerar um número para um documento que é persistido no banco.

    esse número precisa ser gerado de acordo com a empresa que gerou o documento, ou seja, tenho dois objetos no banco, cada um guardando um enum referente a empresa, mais um atributo do tipo long, que guarda o último número gerado.

    o objeto é salvo normalmente, mas quando tento recuperar tal objeto, com o número já alterado, ele simplesmente me retorna 0 (zero), e qualquer alteração que faço nesse objeto é ignorada.

    quando chamo o store, nada acontece... nem um evento de callback é disparado e meu objeto continua do mesmo jeito, mesmo depois de um commit ou mesmo depois de fechar e abrir a conexão com o arquivo do banco.

    seguem alguns trechos de código:

     

    public class RegisterCallback {
        public static void registerCallback(final ObjectContainer db) {
            EventRegistry registry = EventRegistryFactory.forObjectContainer(db);

            registry.creating().addListener(new EventListener4() {
                public void onEvent(Event4 e, EventArgs args) {
                    ObjectEventArgs queryArgs = ((ObjectEventArgs) args);
                    Object obj = queryArgs.object();

                    // gera o id para os objetos de classes que implementam Identified
                    if (obj instanceof Identified) {
                        ((Identified) obj).setId(getNextId(db));
                    }

                    // gera o número para os acertos
                    if (obj instanceof Acerto) {
                        Acerto tmp = (Acerto) obj;
                        tmp.setNumero(getProximoNumeroAcerto(db, tmp.getEmpresa()));
                    }
                }

            });
            
        }

        private static long getNextId(ObjectContainer db) {
            IdGenerator r = IdGenerator.getIdObject(db);
            long nRoll;
            nRoll = r.getNextID(db);
            return nRoll;
        }
        
        private static String getProximoNumeroAcerto(ObjectContainer db,
                Empresa empresa) {
            
            return NumeroAcertoGenerator.getProximoNumeroAcerto(db, empresa);
        }
    }

     

     

    public class NumeroAcertoGenerator {

        public synchronized static String getProximoNumeroAcerto(ObjectContainer db, Empresa empresa) {
            NumeroAcerto ref;
           
            ref = buscaPorEmpresa(db, empresa);
           
            if (ref == null) {
                ref = new NumeroAcerto(empresa);
               
                db.set(ref);
                db.commit();
            }
           
            ref.incrementaNumero();
           
            db.set(ref);
            db.commit();

            return "" + ref.getNumero();
        }

        @SuppressWarnings("serial")
        private static NumeroAcerto buscaPorEmpresa(ObjectContainer db,
                final Empresa empresa) {

            NumeroAcerto result = null;

            // efetua a busca no db4o utilizando Native Query, pelo atributo empresa
            List<NumeroAcerto> list =
                db.query(new Predicate<NumeroAcerto>() {
                    public boolean match(NumeroAcerto numeroAcerto) {
                        return numeroAcerto.getEmpresa().equals(empresa);
                    }
                });

            if (list.size() > 0) {
                result = list.get(0);
            }   

            return result;
        }

    }

     

     

    public class NumeroAcerto implements Serializable {

        static final long serialVersionUID = 1L;
       
        private long numero;
        private Empresa empresa;

        public NumeroAcerto() {
            numero = 0L;
        }

        public NumeroAcerto(Empresa empresa) {
            numero = 0L;
            this.empresa = empresa;
        }

        public void incrementaNumero() {
            numero++;
        }

        public long getNumero() {
            return numero;
        }

        public void setNumero(long numero) {
            this.numero = numero;
        }

        public Empresa getEmpresa() {
            return empresa;
        }

        public void setEmpresa(Empresa empresa) {
            this.empresa = empresa;
        }

    }

     

    um detalhe, percebam que na classe "RegisterCallback" eu também crio um id para identificar os objetos (chave primária), e essa parte funciona perfeitamente... crio o objeto, altero o valor e gravo no banco normalmente... só esse outro, que tem o atributo empresa é que não funciona

    agradeço se alguém conseguir me ajudar com isso...

    já estou pensando em deixar o db4o de lado por esse problema... 

    3 dias quebrando a cabeça com uma coisa simples assim faz a gente desanimar.

     

    abraços


    Douglas C. R. Paes
    blog: http://douglascrp.blogspot.com
    msn: douglascrp@gmail.com
    skype: douglascrp

    The two basic principles of Windows system administration:

    * For minor problems, reboot
    * For major problems, reinstall
View as RSS news feed in XML