Bom, já que me colocaram na briga de volta, vou tentar expressar meu ponto de vista. Uma saída seria isolar e sincronizar o bloco concorrente para garantir a integridade, tipo:
[code]
syncronized(this) {
Turma turma = daoFactory.criarDao().getTurma(1);
//Núcleo envolvendo domínio + conceitos ortogonais
Aluno aluno = new Aluno();
aluno.setNome("ze");
aluno.setMatricula(123456);
turma.adicionar(aluno);
//Fim núcleo
daoFactory.criarDao().salvar(turma); //pode lançar uma exceção de negócio
daoFactory.getTransaction().commit();
} else {
throw new NumeroDeVagasEsgotadasException();
}
}[/code]
Então, desta forma lançaríamos uma exceção de negócios. Lembrando que temos as desvantagens do uso de tal solução, como por exemplo a perda de performance. Vale lembrar também que esse código pode ser otimizado.
[quote=pcalcado]
Se for, supondo que esta regra de negócio só vá ser verificada quando se tenta inserir um registro o DAO que o faz iria receber uma SQLException dizendo que o registro foi duplicado. Supondo que você consiga identificar a causa da SQLException (o Spring é bom nisso) seu DAO pode transformá-la numa exceção de negócios:[/quote]
Ahhh agora faz sentido. (depois de ler ou ter outra opinião é fácil achar sentido)
throw new NaoHavagaException(sqlException);
[quote=pcalcado]
Que pode ser manipulada pelas classes de negócio.[/quote]
Entendi, mas e se no caso acima, o erro fosse retornado a camada de Serviço, o serviço teria a responsabilidade apenas de passar-lo pra frente (seja para apresentação ou aplicação)?
[quote=dreampeppers99][quote=pcalcado]
Que pode ser manipulada pelas classes de negócio.[/quote]
Entendi, mas e se no caso acima, o erro fosse retornado a camada de Serviço, o serviço teria a responsabilidade apenas de passar-lo pra frente (seja para apresentação ou aplicação)?[/quote]
Depende. Como Apresentação depende de Negócios não tem problema ela lidar com as exceções desta Camada porém você pdoe julgar ser mais útil abstrair o erro, por exemplo fazendo NaoHavagaException estender alguma ExcecaoDeNegociosException e apenas exibir a mensagem de erro.