2011-09-24 67 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方法。沒有它,這些改變可能會被忽略。