Hibernate忽略了我的持久调用?

时间:2011-09-24 02:45:49

标签: java mysql hibernate tapestry

我有一个奇怪的问题。无论我做什么,我都无法通过hibernate在数据库中创建新记录。我正在使用Hibernate与Tapestry和MySQL。请有人帮助我!

我有这段代码的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,我以前从未见过这个,所以我不明白?请任何人

2 个答案:

答案 0 :(得分:3)

默认情况下,@CommitAfter注释仅适用于页面/组件类。要在服务对象中获得相同的行为,您需要额外的代码片段。这由this page from the user guide的后半部分涵盖。

  

任何人都可以向我解释这段代码是做什么的

该代码在名称与@CommitAfter匹配的任何服务中查找@Match("*DAO")注释。然后它应用HibernateTransactionAdvisor,如果带注释的方法成功退出,则会添加commit()调用。这是使用Tapestry的一些类似AOP的meta-programming功能完成的。

答案 1 :(得分:2)

你能否在saveUser方法中记录异常 - 如果持久化中出现问题,你就不会知道它,因为你忽略了异常。如果抛出异常,可能有助于找到问题。

另一个问题可能是事务管理 - 如果直接使用hibernate,则需要在事务中调用persist方法。没有它,变化可能会被忽略。