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