2011-09-24 103 views
1

我有一个奇怪的问题。不管我做什么,我都不能通过休眠来在数据库中添加新记录。我使用Hibernate与Tapestry和MySQL。请有人帮助我!Hibernate忽略了我的持续呼叫?

我的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和挂毯,我从来没有见过这个,所以我不明白?请任何人

+0

好吧,我看到的是你需要在服务接口添加注释,因为addTransactionCommitAdvice方法只检查服务,而不是实现(或实现此服务的类)的方法与commitafter注释方法。 – CoffeJunky

回答

3

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

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

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

2

你可以在saveUser方法中记录异常 - 如果persist中出现问题,你将无法知道它,因为你忽略了异常。如果抛出异常,可能有助于发现问题。

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