boa tarde pessoal
eu estava enfrentando um problema muito chato aqui, mas resolvi (acredito que não da melhor forma, infelizmente)
vou descrever o cenário:
eu tenho uma aplicação RCP (Rich Client Platform) onde a persistencia é feita com eclipselink. na aplicação, eu tenho views e editors (não faz muita importancia pra quem não entende, entender a diferença).
na view, eu tenho uma lista de usuários, e ao clicar em algum, abre-se o editor, para permitir a edição deste usuário.
ao editar o usuário e fechar o editor, o proprio rcp ve que houve uma mudança nessa classe e pergunta se o usuário deseja salvar as alterações ou não.
o problema é que, mesmo clicando em ‘não’, o usuário da lista ficava com as modificações que eu tinha feito (somente na lista, não no banco).
descobri que parte disso, era causado pelo fato de meu entityManager ser thread-safe, da seguinte maneira:
private static EntityManagerFactory emf = null;
private static Map<String, Object> properties = new HashMap<String, Object>();
private static final ThreadLocal<EntityManager> ENTITY_MANAGER_CACHE = new ThreadLocal<EntityManager>();
private static void init() {
properties.put(PersistenceUnitProperties.TARGET_DATABASE, TargetDatabase.PostgreSQL);
//outra propriedades omitidas
emf = new PersistenceProvider().createEntityManagerFactory("ecf",
properties);
}
public static EntityManager createEntityManager() {
EntityManager entityManager = ENTITY_MANAGER_CACHE.get();
if (entityManager == null) {
init();
ENTITY_MANAGER_CACHE.set(entityManager = emf.createEntityManager());
}
return entityManager;
}
mas se eu tirar o thread-safe nada mais acontece.
mas tambem descobri que, chamando o método clear() no entitymanager antes de buscar os usuários novamente, esse problema não acontecia, mas os dados eram buscados diretamente do banco agora. parece que o cache não existe mais. mesm eu anotando minha entidade Usuario com @Cache, ele é ignorado
posso invocar o clear()? esta correto? qual a melhor forma de lidar com isso?
obrigado desde ja