Recentemente, comecei um projeto utilizando o Neodatis ODB. Apanhei um pouco, mas agora a coisa está indo bem. Contudo, tem um problema que ainda não consegui resolver: quando atualizo os meus objetos, os atributos que sejam collections não são atualizados. Por exemplo:
Perfil perfil = new Perfil();
perfil.getAcessos().add(new Integer(100));
odb = ODBFactory.open("banco");
odb.store(perfil);
odb.close();
// Até este ponto, perfeito. perfil.getAcessos = {100}
odb = ODBFactory.open("banco");
Perfil perfil = (Perfil)odb.getObjects(Perfil.class).get(0);
perfil.getAcessos().clear();
perfil.getAcessos().add(new Integer(200));
odb.store(perfil);
odb.close();
// perfil.getAcessos() continua com {100}
Você conseguiu resolver o seu problema, seu código parece legal!
P
pango
Olivier,
Infelizmente, ainda não consegui resolver o problema. Se alguém puder dar uma luz...
Olivier
Olá Pango,
Talvez seu problema era da versão 1.5.
A nova versão do NeoDatis ODB 1.8 já está disponível. Eu testei seu código e está funcionando normal
P
pango
Olivier,
Obrigado pela dica. Vou testar com a nova versão...
Olivier
Qualquer coisa,
me fale se o problema continua!
P
pango
Olivier,
Funcionou sim, muito obrigado pela sua ajuda!!!
Olivier
Olá Pango,
que bom!
Qualquer dúvida a respeito do ODB, pode perguntar, eu sou um dos desenvolvedores do projeto NeoDatisODB.
Estamos a disposição!
P
pango
Olivier,
Muito bacana saber que você participa do projeto. Prepare-se para ser explorado…
Parabéns pelo bom trabalho!
Olivier
Pango,
Sem problemas…
F
flaviomreis
Boa tarde amigos!
Bom, estava até a pouco usando Db4O em alguns projetos meus, mas não to conseguindo extrair uma boa performance dele e também não consigo muita ajuda (problema de todo leigo como eu).
Esta vai direto pra você Oliver! Existe algum fórum específico para ODB?
Já de cara arranco com a seguinte dúvida! Existe como fazer uma pesquisa do tipo
IQuery = new CriteriaQuery(Pessoa.class, Where.equal("nome", "Flávio"));
Só que gostaria que fosse retornado na lista, inclusive pessoas com o nome FLÁVIO, ou FláVIO, algo como um equalsIgnoreCase… sei que existe SimpleNativeQuery e foi assim que implementei minha consulta, mas não seria mais lenta? Ah! E um índice pelo atributo nome da classe Pessoa ajudaria neste caso? Mesmo eu usando SimpleNativeQuery.
É lançada esta exceção quando tendo fazer o “cast”. Todos os meus DAOs utilizam List e em todo o meu sistema. Como vou ter que proceder? Copiar todos os itens de Objects para uma List?
Obrigado
Olivier
Flávio,
o problema é que todos os resultados do ODB.getObjects retornam objetos que implementam Collection que é uma interface mais generica que List.
A única solução que vejo é :
Não é muito bom pois irá perder um tempo copiando a lista cada vez. Em Termo de memória, a collection retornada pelo odb.getObjects será pegou pelo garbage collector após a saida do metódo.
Como ficou a performance da query na classe Pessoa? Criou um Index?
F
flaviomreis
Bom, estou modificando meu sistema para usar Collection e quando precisar List, daí sim faço um addAll() passando a Collection, o problema agora é que depois de feita uma consulta à base, quando estou tentando fazer outra (não fecho nunca a conexão com a base) retorna a seguinte exceção:
public class DbAccess {
private static ODB db = null;
static {
try {
db = ODBFactory.open("db.odb");
String[] fieldNames = {"nome"};
db.getClassRepresentation(Cidade.class).addUniqueIndexOn("cidade-nome", fieldNames, true);
} catch (Exception e) {
JOptionPane.showMessageDialog(null, "Erro ao iniciar aplicação. Verifique as exceçõss", "Erro", JOptionPane.ERROR_MESSAGE);
e.printStackTrace();
System.exit(-1);
}
}
public static ODB getDb() {
return db;
}
Onde estou errando?
Obrigado
Olivier
Parece que está ok, vc tem como mandar seu código para tentar reproduzir aqui?
Tb não é aconselhado deixar a conexão aberta o tempo todo. é Bom abrir, executar o que precisa e fechar o odb num finally.
Olivier
Olá Flávio,
acho que entendi. A sua aplição é Swing ou roda em multi-thread?
Parace que o banco foi aberto numa thread e a consulta executada em outra.
Me confirme isso por favor
F
flaviomreis
Como faço pra te enviar meu projeto, ele é maior que 512K e não consigo anexar ? É em swing sim só que não é multithread que estou utilizando o ODB, o problema de fechar sessão é quando preciso mostrar uma lista em uma tabela ou em combobox, list, assim, uso os objetos que estão vinculados à base e se precisar alterá-los posso simplesmente chamar um .store(objeto) e pronto. Sempre fiz assim com o Db4O e estava legal.
Obrigado
Olivier
OK então pode deixar aberto o bd.
Não vai precisar enviar o projeto.
O problema que está acontecendo é devido ao swing pelo jeito. Consegui reproduzir aqui. Apesar de vc não usar multithread, o swing usa. e neste caso a sessão do ODB está associada a thread (e não deveria em modo local).
Já estou colocando uma versão que não usa a thread para identificar a sessão.
F
flaviomreis
Obrigado Oliver! Vou ficar “de butuca” esperando…
Olivier
Flávio,
coloquei uma versão que deve resolver seu problema :
Tá ficando bom… Só to com um problema, cada vez que ocorre uma exceção eu termino a execução do programa de força forçada às vezes e vão sendo criados os arquivos db.odb-1197576405078-local 119757640506936111534836820746.transaction. Estive mexendo com os objetos Vendedor, incluindo e excluindo e de repente, em uma inicialização do sistema ocorreu esta exceção, como corrijo a base?
eu acho que o ODB não gosta muito de ficar o tempo todo aberto sem commit nem close.
O arquivo .transaction é a transação corrente que está sendo persistida até o commit.
Vc diz que as vezes vc sai do programa sem dar um close ou rollback é isso? essas exceções (que vc está falando) são do ODB ou do seu programa?
Vc consegue reproduzir este problema?
Se for o caso, me mande por email.
Valeu Flávio
Olivier
Olá Flávio,
Tentei reproduzir o problema que vc está relatando mas não consegui. Pode me ajudar?
F
flaviomreis
Olá Oliver!
Estas exceções ocorrem quando tento abrir o arquivo, até mesmo no explorer do ODB é lançada esta exceção quando tento abri-lo. Assim que chegar no meu local de trabalho te envio o arquivo pra ti analisar. Sim, todas as vezes que tento abrir o arquivo esta exceção ocorre.