Olá bom dia, levando em conta o fluxo mvc temos o seguinte cenário:
View -> Controller -> BO -> DAO -> Generic DAO
Ok, assunto batido, mas me deparei com uma situação que resolvi pedi um auxilio aos Srs., bom o projeto tem Spring e hibernate atualmente o @Transact está dentro do generic dao mas para utilizar o roll back das transações do spring coloquei o transact dentro do BO levando em conta que dentro do Generic DAO não tenho try catch, dai veio a surpresa, a transação funcionou mas o try catch de dentro do BO não… forcei uma excessão e ele simplesmente passou direto enviando a excessao para a view sem tratamento. Gostaria de saber se há algum parametro dentro do transact para que ele leve em conta o try catch, o codigo do BO é parecido com o abaixo:
Desculpe como estou no trabalho e o projeto esta em casa escrevi erroneamente o nome da anotação, não é transact e sim Transactional do Spring (import org.springframework.transaction.annotation.Transactional), segue como solicitado o arquivo web.xml
certo. cole aqui o conteudo do applicationContext.xml pra gente ver, embora eu acredite que voce tenha esquecido do atributo rollbackFor
edit: acho que nao tinha lido direiti sua duvida. Voce quis dizer que quando a exceção é capturada ai em cima, ela nao da rollback? desculpa, mas nao entendi sua duvida :shock:
A duvida é exatamente sobre a exception, ele não entra no try catch, vamos supor que eu va adicionar uma entidade com o atributo nome unique, dai eu va adicionar um cliente so que o cliente ja existe no banco isso caracteriza uma DataIntegrityViolationException só que ele não entra no try, ele não consegue gravar vai pro return e retorna a excessão para a view, se eu colocar o @Transactional no BO e colocar o try no controlador (Uma camada acima) ai sim ele captura, ou seja, se caso eu colocar o @transactional na camada X nesta mesma camada eu não consigo capturar nenhuma exception, a solução seria passar para a camada DAO Generico que se acontecer alguma excessão está sendo tratada na camada de cima, porém perco a utilidade do Roll Back devido o try estar em outra camada. Segue o arquivo applicationContext.xml com as configurações do spring como solicitado.
ObjetoBO.salvar(objeto);
class ObjetoBO {
@Transactional(rollbackFor=Exception.class)
public void salvar(Objeto objeto) {
try {
ObjetoDAO.salvar(objeto);
} catch(Exception e) {
// se você capturar alguma exception aqui, e não propogar, o TransactionManager vai pensar que está tudo ok, e irá comitar. Se quiser fazer algum tratamento, faca aqui e depois lance a exceção normalmente com um throws :)
}
}
}
class ObjetoDAO {
@Transactional(rollbackFor=Exception.class)
public void salvar(Objeto objeto) {
GenericDAO.salvar(objeto);
// você não pode dar catch de exceção aqui
}
}
class GenericDAO {
EntityManager entityManager;
@Transactional(rollbackFor=Exception.class)
public void salvar(Objeto objeto) {
entityManager.persist(objeto);
// você não pode dar catch de exceção aqui
}
}
Analisando o codigo que me enviou você quiz dizer que o que faltou para que o meu codigo capturasse as exceptions foi colocar dentro do transaction o parametro rollbackFor=Exception.class que quer dizer que dentro daquela transação poderá acontecer exceptions do tipo Exception que é um dos tipos mais genericos de excessão… é isso mesmo ??