Vamos começar com o típico ApplicationManager para usar Hibernate + Mentawai:
Code:
public class ApplicationManager extends org.mentawai.core.ApplicationManager {
public void init(Context context) {
// sua implementação de NewsService...
ioc("newsService", NewsServiceImpl.class);
// sua implementação de NewsDao...
ioc("newsDAO", HibernateNewsDAO.class);
// implementação de transaction para o Hibernate que já vem com o Mentawai...
ioc("transaction", HibernateTransaction.class);
}
public void loadActions() {
// transformando mentawai num container de IoC...
addGlobalFilter(new IoCFilter());
// todas as actions terão uma session do Hibernate disponível através desse filtro...
// true = transactional, ou seja, sempre que a session for aberta, uma transação do hibernate tb será aberta...
//(nada te impede de usar um TransactionFilter para melhor controlar essa transação do hibernate)...
addGlobalFilter(new HibernateFilter(true));
// tudo que precisar de uma session do hibernate vai recebe-la, no nosso caso aqui: HibernateTransaction e HiberanateNewsDAO... (famoso AUTO-WIRING)
addGlobalFilter(new DIFilter("session", Session.class));
// tudo que precisar de um NewsDAO, vai receber um NewsDAO. No nosso caso aqui será um HibernateNewsDAO (vide ioc acima) e provavelmente será injetado no nosso modelo de negócios...
addGlobalFilter(new DIFilter("newsDAO", NewsDAO.class));
// tudo que está no input da action será injetado na action (ou no model se action for model driven)...
addGlobalFilter(new InjectionFilter());
// tudo que está na action (ou no model se a action for model-driven) será colocado no output da action...
addGlobalFilter(new OutputFilter());
ActionConfig actionConfig = new ActionConfig("news", NewsAction.class);
actionConfig.addConsequence(NewsAction.LIST_JSP, new Forward("/list.jsp"));
actionConfig.addConsequence(NewsAction.LIST, new Redirect("news.mtw"));
actionConfig.addConsequence(NewsAction.SHOW, new Forward("/update.jsp"));
actionConfig.addFilter(new NewsValidationFilter(), "update");
actionConfig.addFilter(new NewsValidationFilter(), "add");
actionConfig.addConsequence(NewsAction.ERROR, "add", new Forward("add.jsp"));
actionConfig.addConsequence(NewsAction.ERROR, "update", new Forward("update.jsp"));
actionConfig.addFilter(new VOFilter("news", News.class));
add(actionConfig);
}
public void loadLocales() {
LocaleManager.add("en");
LocaleManager.add("pt");
}
}
E o nosso VO:
Code:
public class News implements Serializable {
private Long id;
private String title;
private String body;
private Date creationDate;
Nesse caso temos a classe News como VO que recebe os valores automaticamente preenchidos no formulário.
Injetados com DI temos a sessão do Hibernate e o newsDAO.
Até aí sem problemas... todos os dados do VO são preenchidos e trafegam da camada de visão (JSP) para a camada de persistência (Hibernate) sem problemas.
Mas se o nosso objeto News sofrer uma composição com outro objeto, por exemplo um User:
Code:
public class News implements Serializable {
private Long id;
private String title;
private String body;
private Date creationDate;
private User loggedUser;
Aí temos um problema, pois o o objeto filho loggedUser não será criado e injetado automaticamente pelo VOFilter do objeto pai News.
Para isso funcionar precisamos de outro VOFilter para o objeto filho e também de um DIFilter para injetar o objeto filho (dependencia) no objeto pai.
Code:
// cria um novo VO para formar o objeto filho User...
actionConfig.addFilter(new VOFilter("loggedUser", User.class));
// quando o objeto pai News for requisitado, o DIFilter abaixo detectará a dependencia no objeto filho User e fará a composiçao, injetando o filho no pai...
actionConfig.addFilter(new DIFilter("loggedUser", User.class);
Com isso na sua aplicação os objetos serão ligados e você conseguirá persiti-los sem problemas através do Hibernate!