从petclinic jpa中的EntityManager获取会话对象

时间:2013-12-11 23:40:40

标签: java spring hibernate spring-mvc jpa

与此问题相关的所有代码都在下面的超链接中。

我想从PetController.java访问spring petclinic sample application文件中的会话对象。我的应用程序配置为使用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调用session

我需要从PetController.java调用entitymanager对象,因此可能是session。 (对于那些感兴趣的人来说,这是一个通过网络表单从用户那里传来的文件,但我不想把这个帖子弄得太复杂。我只想要一个简单的答案,我怎样才能获得{{1}使用jpa在PetController.java中的对象。)我在PetController.java中使用什么语法?我还需要在应用程序的其他位置进行哪些其他更改,以便为整个应用程序集中管理entityManagersessions

2 个答案:

答案 0 :(得分:1)

代码在示例项目中的组织方式是因为所有持久性代码都更适合包含项目DAO(数据访问对象)的petclinic.model包中{{1}的类命名约定。控制器的工作是简单地将HTTP请求路由到业务逻辑,并且应该保持苗条(逻辑上)。对于您的示例,您可能最好创建一个新的DAO和服务类,可能称为xxxRepositoryFileService,以及它们相应的实现(您可以使用示例中的现有类作为示例)。创建这些类后,您可以在需要它的任何控制器中包含FileRepository。对于FileService,逻辑流程看起来像PetController。如果你想集中实体管理器,我只建议为其他DAO下降的通用DAO类做,而不包括控制器中的实体管理器。

答案 1 :(得分:1)

您应该避免直接访问会话对象,而是使用注入的EJB(PetRepository)。 所有数据库/ jpa业务逻辑都必须位于EJB方法中,默认情况下这些方法是事务性的。