Problema com transação [RESOLVIDO]

Bom dia Pessoal estou com um problema em transações…
tenho uma tela onde possuí um campo obrigatório que é a chave estrangeira…
Quando esse campo estiver vazio e o usuário tentar salvar, ocorre um erro pois esse campo é obrigatório…

DAOFactory

private EntityManagerFactory emf;
private EntityManager em;
	
	public DAOFactory() {
		emf = Persistence.createEntityManagerFactory("kontant");
		em = emf.createEntityManager();
		tipoCustoDAO = new TipoCustoDAO(em);
		custoDAO = new CustoDAO(em);

CustoDAO

public void save(EntityCusto entityCusto) { EntityTransaction et = em.getTransaction(); et.begin(); if(em.contains(entityCusto)) { em.merge(entityCusto); } else { em.persist(entityCusto); } et.commit(); }

O erro esperado

[color=red]javax.persistence.PersistenceException: org.hibernate.PropertyValueException: not-null property references a null or transient value: entity.EntityCusto.tipocusto
at org.hibernate.ejb.AbstractEntityManagerImpl.throwPersistenceException(AbstractEntityManagerImpl.java:630)
at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:219)
at dao.CustoDAO.save(CustoDAO.java:31)[/color]

pois eu não posso incluir um custo sem o tipo de custo blz…
Até aí tudo bem…
eu fecho essa tela e entro na tela de tipo de custo para inserir um novo registro

TipoCustoDAO

public void save(EntityTipoCusto entityTipoCusto) { EntityTransaction et = em.getTransaction(); et.begin(); if(em.contains(entityTipoCusto)) { em.merge(entityTipoCusto); } else { em.persist(entityTipoCusto); } et.commit(); }
e quando vou salvar mostra o seguinte erro…

[color=red]java.lang.IllegalStateException: Transaction already active
at org.hibernate.ejb.TransactionImpl.begin(TransactionImpl.java:35)
at dao.TipoCustoDAO.save(TipoCustoDAO.java:22)
at control.ControlTipoCusto.actionPerformed(ControlTipoCusto.java:39)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)[/color]

O que eu estou querendo é que salve o tipo de custo após ter dado o erro ao tentar salvar um custo sem o tipo de custo

Agradeço desde já :smiley:

Fala aew barney, tudo bem?

Pelo o que eu to vendo no seu código, quando voce nao preenche o tipo do custo ocorre um erro na linha 5(em.merge(entityTipoCusto); ) ou 7(em.persist(entityTipoCusto); ) da classe custodao e isso faz com que o codigo do commit nunca rode e a transacao fique aberta e quando voce preenche o tipo e tenta salvar novamente a transacao anterior vai continuar aberta e o erro vai ocorrer.

Uma solucao seria tratar a excecao que ocorre ao salvar sem o tipo de custo e fazer a transacao ser terminada no finnaly, sacou?

Por exemplo:

public void save(EntityTipoCusto entityTipoCusto) {
        EntityTransaction et = em.getTransaction();

try
{
        et.begin();
        if(em.contains(entityTipoCusto)) {
            em.merge(entityTipoCusto);
        } else {
            em.persist(entityTipoCusto);
        }
        et.commit();
}
catch(Exception e)
{
     // trata os erros
}
finally{
       //verifica se a transacao esta ativa e fecha caso ainda esteja aberta
}

Espero ter ajudado

flws

Descobri o erro…
na verdade meu erro foi tentar controlar as exceptions na camada Controler
ao deixar a exception estourar na camada DAO ele termina a transação assim
vou tratar meus erros nessa camada

Agradeço a atenção :smiley: