Isso está funcionando, mas eu me peguei em uma situação ruim.
Tem um momento em q eu tenho 3 entidades relacionadas e preciso salvar as 3.
Se eu salvar duas delas e der problema na terceira, ele mantém as duas salvas.
Eu preciso fazer rollback nas duas salvas, mas isso não está tão fácil assim.
Não ta facil pq eu faço o seguinte: salvo uma entidade e commito para poder pegar a referencia e relacionar na outra entidade.
Se eu não commitar ele dá erro na hora de relacionar a entidade salva (e não commitada) na que não foi salva ainda.
Isso pq (acredito eu) estão em EntityManager e transações diferentes e uma não enxerga a outra.
Poderiam me sugerir uma espécie de Dao genérico que não caia nesse problema ?
Ou uma forma para resolver esse problema neste tipo de Dao.
Mas você não precisa fazer essa barbaridade toda.
Você deve confirmar a transação (commit) apenas ao fim da execução de todas as alterações no banco.
Quando você faz:
session.save(obj);
A referência permanece e, dependendo de como você gerencia a PK no banco, ele já recebe a PK e está pronto para uso. O próprio hibernate faz isso por você (já que usa Session).
F
fdiaz2011
Mas é isso q eu qria e oq fui fazer, mas não rolou.
Com o dao dessa forma eu preciso fazer o seguinte.
EntidadeUmDao entidadeUmDao = new EntidadeUmDao();
entidadeUmDao.beginTransaction();
entidadeUmDao.save(entidadeUm);
entidadeUmDao.commit();
Mas se eu fizer o commit() logo após o save() não dá erro algum e tudo é salvo de boa.
Acredito q esse erro aconteça pelo fato de serem transações diferentes e um não enxerga o outro já que não teve o commit.
kdoigor
entenda como funciona UserTransaction e ContainerTransaction e analise qual delas se adequa mais ao seu cenário.
drsmachado
Quando você invoca
entidadeDoisDAO.beginTransaction();
E depois
entidadeUmDAO.beginTransaction();
Você está criando duas transações diferentes. Isso não deve ocorrer. As referências irão existir dentro da mesma transação, até que um commit seja executado.
Você tem um DAO genérico, por que não faz uso dele?
Faça o DAO genérico gerenciar as transações.
drsmachado
Ele obviamente não está trabalhando com um app server…
kdoigor
Ele obviamente não está trabalhando com um app server…
jta independe de app server. ja usei UserTransaction em sistema desktop.
drsmachado
Ele obviamente não está trabalhando com um app server…
jta independe de app server. ja usei UserTransaction em sistema desktop.
Mas desktop, por padrão, é UserTransaction…
kdoigor
drsmachado:
Mas desktop, por padrão, é UserTransaction…
ah tá, então não precisa implementar no DAO ?
F
fdiaz2011
Então, é oq eu falei das duas transações.
Eu uso o GenericDao, porém eu faço isso devido a forma do GenericDao.
Pelo q estou vendo preciso deixar o GenericDao mais genérico.
F
fdiaz2011
Vi q oq preciso fazer é para resolver isso é um joinTransaction(), mas ainda não achei como fazer isso no hibernate.
Com JPA é fácil, mas eu uso Session do hibernate.
public void joinTransaction() {
em = emf.createEntityManager();
em.joinTransaction();
}