Serviços do Grails, Transações e Rollback automático

Comprei o livro recente que saiu do Glen Smith, o Grails in Action. E, claro, comecei a ler. Ainda não terminei. Mas já valeu a compra e a dedicação de ler só pelo fato que eu descobri e não sabia:


Nos serviços do grails ( classes *Service.groovy, dentro do diretório services), que possuem Transação Declarativa , o default é cada método ser transacional. Isso significa que uma transação será iniciada antes do método do serviço começar a ser executado, e será finalizada (commit ou rollback) ao final.

O rollback acontece automaticamente quando uma Exception é lançada. O que eu não sabia era que apenas Runtime Exceptions fazem o rollback acontecer. Checked Exceptions não. Isso mudou minha vida! :-)

Eu fazia um try catch no controller, às vezes, pegando o tipo Exception no catch. Grave erro conceitual de cara né, mas pior ainda, pois eu estava contando com o rollback que poderia não acontecer.

Então amigos: apenas classes derivadas de RuntimeException fazem o rollback acontecer.

Abcs

3 comentários:

Gustavo 1 de outubro de 2009 às 12:20

felipe, Parabén mais uma vez pelo blog. gostaria de aproveitar e perguntar se teria um link sobre relacionamento many-To-Many com um porém, na table gerada pelo hibernate acrescente uma coluna "criterio" por exemplo.
cheguei a usar indexed_Item mas não to achando nada a respeito no grails.
estou precisando para um caso entre Livros e Autors onde o realcionamento merstre é Author. mas quero que a tabela criada pelo hibernate, ao invés de ter id de produtos e id de tags, possa ter uma outra que eu estipulo!!! se tiver como fazer isso sem xml melhor ainda !! no mais agradeco pelas publicações

Gustavo 1 de outubro de 2009 às 12:21

ps.: já vi o seu post sobre MAny-toMany !! por isso resolvi perguntar sobre isso !!! abraos

Felipe Nascimento 1 de outubro de 2009 às 14:54

Tavinho,
até onde sei, você terá que criar uma entidade para este relacionamento.
Os relacionamentos many-to-many sao desta forma q vc conhece, com duas chaves estrangeiras sendo chave primária, sem nenhum outro campo na tabela.
Se tem campo na tabela de relacionamento, é porque, no mundo de objetos, este deixa de ser apenas um relacionamento, e passa a ser uma Entidade por si só.
Assim, vc terá 3 entidades:
A 1:n B m:1 C

acho q eh isso ai
abcs