2013-12-11 24 views
0

與此問題相關的所有代碼位於以下超鏈接中。從petclinic jpa中的EntityManager獲取會話對象

我想從spring petclinic sample application訪問PetController.java文件中的會話對象。我將我的應用程序配置爲使用jpa。

這裏是我想要添加到的方法之一PetController.java什麼:

Session session = entityManager.unwrap(Session.class); 
Blob blob = Hibernate.getLobCreator(session).createBlob(file.getInputStream(), file.getSize()); 

我的問題是如何設置了entityManager使其集中組織並在應用程序連接到的一切它需要連接?

我找到this example of EntityManager in petclinic's JpaVetRepositoryImpl.java。它使用的語法:

@PersistenceContext 
private EntityManager em; 

EntityManager似乎並沒有從VetController.java調用。

我需要調用PetController.java中的session對象,因此可能需要調用entitymanager。 (對於那些感興趣的用戶來說,這是一個通過網絡表單發送給用戶的文件,但我不想通過使其過於複雜來混淆本文。我只想簡單回答一下如何在PetController.java中獲得session對象使用jpa。)我在PetController.java中使用什麼語法?爲了使entityManagersessions能夠集中管理整個應用程序,我還需要在應用程序中的其他位置進行其他更改嗎?

回答

1

在示例項目中代碼的組織方式是因爲所有持久性代碼將更適合petclinic.model包,其中包含項目的DAO(數據訪問對象)和xxxRepository命名約定的類。控制器的工作是簡單地將HTTP請求路由到業務邏輯,並且應該保持纖巧(按邏輯)。對於你的例子,你可能最好創建一個新的DAO和服務類,可能叫FileServiceFileRepository,以及它們相應的實現(你可以使用示例中現有的類作爲例子)。一旦創建了這些類,您可以在需要它的任何控制器中包含FileService。對於PetController,你的邏輯流程看起來像這樣PetController -> FileService -> FileRepository.saveFile()。如果你想集中實體管理器,我只會建議做一個通用的DAO類,其他DAO類下降,不包括控制器中的實體管理器。

1

您應該避免直接訪問會話對象,而應該使用注入的EJB(PetRepository)。 所有數據庫/ jpa業務邏輯必須位於EJB方法內部,這些方法默認爲事務性的。