Featured Post

Jamais compre um notebook HP !!!

Eu fui proprietário de um notebook HP, modelo tx1070br, que parou de funcionar de forma repentina. Pesquisando nos fóruns, qual não foi a minha surpresa ao constatar que CENTENAS de pessoas tiveram o mesmo problema ? Em quase todos os casos, para não generalizar, a HP ignorou o caso e como a maioria...

Read More

SessionScope e FlushAction no Castle ActiveRecord

Posted by Luiz Picanço | Posted in .Net, C# | Posted on 09-04-2010

Tags: , , , , , , , , , , ,

3,044

O Castle ActiveRecord é uma implementação do padrão homônimo feita em cima nHibernate. Um ORM bastante conhecido no mundo Java. Apesar de alguns comportamentos serem realizados pelo nHibernate, estarei aqui citando o ActiveRecord como responsável por tais comportamentos.

Um problema muito comum que eu costumo me deparar, é com a utilização de lazy loading no ActiveRecord.

Geralmente na utilização de lazy loading em aplicações web, é utilizado o padrão Session per Request para o SessionScope. Só que por padrão, o ActiveRecord persiste automaticamente (em algumas situações) as entidades, mesmo que seus métodos Save ou Update não tenham sido invocados. Isso costuma gerar uma série de problemas, como por exemplo, entidades com o seu estado interno inválido sendo persistido.

Para resolver esse problema, deve ser especificado o FlushAction como Never:

1
SessionScope session = new SessionScope(FlushAction.Never);

Assim, o ActiveRecord não irá mais persistir automaticamente as entidades. Em contrapartida, mesmo invocando os métodos Save ou Update as entidades não serão persistidas. Para que isso ocorra, será necessário utilizar os métodos SaveAndFlush e UpdateAndFlush, respectivamente, ou utilizar o método Flush da instância do SessionScope.