我有这段代码的UserDAO类:
@CommitAfter
public boolean saveUser(User user){
try {
session.persist(user);
return true;
}catch(Exception e){
return false;
}
}
然后我在这里称呼它:
@OnEvent(component="add")
Object onAdd(){
if(username!=null && password!=null){
User user = new UserBean();
user.setUsername(username);
user.setPassword(password);
userService.saveUser(user);
}
if(eventName!=null){
Event event = new EventBean();
event.setName(eventName);
eventService.saveEvent(event);
}
return this;
}
但它不起作用,我不知道为什么,请帮忙!
这是完整的项目:http://www.mediafire.com/?pqb2aaadhbukuav
我在AppModule.java中添加了这段代码,现在可以正常工作了
@Match("*DAO")
public static void adviseTransactions(HibernateTransactionAdvisor advisor, MethodAdviceReceiver receiver) {
advisor.addTransactionCommitAdvice(receiver);
}
任何人都可以向我解释这段代码在做什么吗? 这不是我第一次使用hibernate和tapestry,我以前从未见过这个,所以我不明白?请任何人
答案 0 :(得分:3)
默认情况下,@CommitAfter
注释仅适用于页面/组件类。要在服务对象中获得相同的行为,您需要额外的代码片段。这由this page from the user guide的后半部分涵盖。
任何人都可以向我解释这段代码是做什么的
该代码在名称与@CommitAfter
匹配的任何服务中查找@Match("*DAO")
注释。然后它应用HibernateTransactionAdvisor
,如果带注释的方法成功退出,则会添加commit()
调用。这是使用Tapestry的一些类似AOP的meta-programming功能完成的。
答案 1 :(得分:2)
你能否在saveUser方法中记录异常 - 如果持久化中出现问题,你就不会知道它,因为你忽略了异常。如果抛出异常,可能有助于找到问题。
另一个问题可能是事务管理 - 如果直接使用hibernate,则需要在事务中调用persist方法。没有它,变化可能会被忽略。