Bom dia pessoal,
Tenho duas classes sendo que uma é a classe “mestre” e a outra “detalhes”. Estas classes estão mapedas corretamente no Hibernate sendo sua relação OneToMany, do mestre ao detalhe.
Até ai nenhum problema, tudo funciona bem exceto quando começo a trabalhar com concorrência.
Segue o código de simulação:
public class Main {
private static List<ChildEntity> getEntity(MasterEntity me, Integer id, String name){
ChildEntity c = new ChildEntity(me);
c.setId(id);
c.setName(name);
List<ChildEntity> child = new ArrayList<ChildEntity>();
child.add(c);
return child;
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) throws IllegalStateException, SystemException {
//criando unidade de persistência
HibernateEntityManagerFactory factory = (HibernateEntityManagerFactory) Persistence.createEntityManagerFactory("poc-hibernatePU");
//
HibernateEntityManager em1 = (HibernateEntityManager) factory.createEntityManager();
HibernateEntityManager em2 = (HibernateEntityManager) factory.createEntityManager();
//
Transaction transaction1 = em1.getSession().beginTransaction();
Transaction transaction2 = em2.getSession().beginTransaction();
//criando o repository
MasterRepository repository1 = new MasterRepositoryImpl(em1.getSession());
MasterRepository repository2 = new MasterRepositoryImpl(em2.getSession());
//criando um dado mestre
MasterEntity masterEntity1 = repository1.find();
MasterEntity masterEntity2 = repository2.find();
//
System.out.println("Objeto 1: " + masterEntity1);
System.out.println("Objeto 2: " + masterEntity2);
//
System.out.println("----------antes de qualquer alteração");
System.out.println(masterEntity1.getName() + " - qtd de itens: " + masterEntity1.getChildEntitys().size());
System.out.println(masterEntity2.getName() + " - qtd de itens: " + masterEntity2.getChildEntitys().size());
//
masterEntity1.setName("MasterEntity1");
masterEntity1.setChildEntitys(getEntity(masterEntity1, 10, "Child10"));
//
System.out.println("----------depois de alteração 1");
System.out.println(masterEntity1.getName() + " - qtd de itens: " + masterEntity1.getChildEntitys().size());
System.out.println(masterEntity2.getName() + " - qtd de itens: " + masterEntity2.getChildEntitys().size());
//
masterEntity2.setName("MasterEntity2");
masterEntity2.setChildEntitys(getEntity(masterEntity2, 11, "Child11"));
//
System.out.println("----------depois de alteração 2");
System.out.println(masterEntity1.getName() + " - qtd de itens: " + masterEntity1.getChildEntitys().size());
System.out.println(masterEntity2.getName() + " - qtd de itens: " + masterEntity2.getChildEntitys().size());
//
repository2.update(masterEntity2);
repository1.update(masterEntity1);
//cometer os dados do ultimo para o primeiro
transaction2.commit();
transaction1.commit();
}
}
ao executar o console tem este resultado:
Objeto 1: pochibernate.MasterEntity@9c
Objeto 2: pochibernate.MasterEntity@9c
----------antes de qualquer alteração
MasterEntity2 - qtd de itens: 2
MasterEntity2 - qtd de itens: 2
----------depois de alteração 1
MasterEntity1 - qtd de itens: 1
MasterEntity2 - qtd de itens: 2
----------depois de alteração 2
MasterEntity1 - qtd de itens: 1
MasterEntity2 - qtd de itens: 1
As tabelas do banco de dados ficam assim:
Tabela Mestre antes: 
Tabela Detalhe antes: 
Tabela Mestre depois: 
Tabela Detalhe depois: 
Assim, gostaria de saber como resolver dois problemas:
- A Tabela Mestre não pode ter dados alterados simultaneamente e
- A Tabela detalhe que se apresenta com apenas 1 item ao final da operação está inconsistente em relação ao banco de dados.
O que eu posso fazer para resolver estes dois problemas? Ou onde eu posso encontrar algo que trate deste assunto especificamente?
Desde já, obrigado a todos.
