使用Spring + Hibernate进行测试

时间:2015-01-20 14:47:10

标签: spring hibernate jpa

我想更多地澄清一下我的问题:

  1. 我理解使用SPring Framework(即容器管理的对象生命周期)和Hibernate(在Java对象和关系数据库系统之间使用ORM - 阻抗不匹配解析)的目的。

  2. 我理解我们如何自动装配一个对象,Spring在运行时通过查看applicationContext.xml文件来接管对象的创建和销毁(如果使用Hibernate或任何其他文件,则除了persistence.xml文件)持久性提供者)。

  3. 我想做的是以下内容:

    1. 我想实现自己的购物服务。我已经用@ Table,@ Id,@ Column等注释了实体(项目),告诉JPA这将存储在数据库中。

    2. 我已经有一个由DaoImpl类实现的DAO接口(目前只有添加和删除方法),我已经完成了以下操作:

      @Repository
      @Transactional
      public class MyShopDbDaoImpl implements MyShopDbDao {
          // The following named unit will be in my persistence.xml file
          // Which will be placed in src/main/resources/META-INF folder
          @PersistenceContext(unitName="myShopDbDao")
          private EntityManager em;
      
          // Getters for em (simply returns em)
      
          // Setters for em (simply assigns an em supplied in the args.)
      
      
          // Other query method
      }
      
    3. 我还有一个ShopDbController控制器类,它使用:

      @Autowired
      // defined in the applicationContext.xml file
      private MyShopDbDao myShopDbDaoImpl
      
    4. 我正在努力解决的是EntityManagerFactoryEntityManager关系的“理解”以及必须如何管理交易。我知道以下层次结构是理解这一点的主要出发点:

      1. 客户与控制器交谈。

      2. Controller映射请求并让实体管理员对数据库进行查询和填充(使用JUNIT测试等的测试/本地数据库或实际的SQL类型数据库)。

      3. 我所知道的是,可以手动(即开始,提交和关闭会话)或通过Spring容器(即在applicationContext.xml文件中使用bean defs)来管理事务。如何获取有关entitymanagers和entitymanagerfactory的更多信息以便设置我的系统?

        我没有发现Oracle / Spring / Hibernate的在线文档非常有用。我需要一个例子和关于entitymanagerfactory,sessionfactory,entitymanager和transactionmanager之间关系的解释。有人可以帮帮我吗?

        我不需要别人握住我的手,而只是让我朝着正确的方向前进。我之前做过Spring项目,但从来没有深入到过某些东西。任何帮助表示赞赏。

3 个答案:

答案 0 :(得分:2)

EntityManagerFactory将通过打开/关闭与数据库的新物理连接或使用连接池(c3p0,bonecp,hikari或您喜欢的任何实现)来获取java.sql.Connection个对象。获得Connection后,它将使用它来创建新的EntityManagerEntityManager可以使用此Connection与您的对象和数据库进行互动,并可以通过调用EntityManager#getTransaction然后调用EntityTransaction#beginEntityTransaction#commit和{{来管理交易1}}内部分别与EntityTransaction#rollbackConnection#beginConnection#commit一起使用。这是普通的JPA,而Spring在这一点上无所事事。

对于事务管理,Spring可以帮助您避免使用事务管理器(特别是名为JpaTransactionManager的类)手动打开/关闭事务。此事务管理器将使用您的Connection#rollback来打开和关闭为一组操作创建的EntityManagerFactory的事务。这可以使用XML配置或类/方法上的EntityManager注释来完成。使用这种方法时,您将不再直接使用您的特定类,而是Spring将使用cglib为您的类创建代理,并使用事务管理器类打开事务,调用您的特定方法并执行最后提交或回滚,具体取决于您的配置。除此之外,Spring还提供其他配置,如只读事务(不允许数据修改操作)。

以下是使用Spring / Hibernate / JPA解释上述元素的基本配置:

@Transactional

答案 1 :(得分:1)

非常一般:

  • entitymanagerfactory是负责创建实体管理器的对象,它来自JPA规范。
  • SessionFactory是entitymanagerfactory的hibernate实现
  • session是entitymanager的hibernate实现
  • 当您想手动定义交易时,交易管理器是管理交易的对象。

因此,如果您想使用hibernate,请使用SessionFactory和session。如果你想让你留下来#34;泛型"使用EntityManagerFactory。

http://www.javabeat.net/jpa-entitymanager-vs-hibernate-sessionfactory/ http://www.theserverside.com/tip/How-to-get-the-Hibernate-Session-from-the-JPA-20-EntityManager

答案 2 :(得分:1)

从我看到的,你的em引用应该是数据库的一个正常运行的代理对象(这个EntityManager应该是一个spring bean,配置了所有内容,比如DB url,driver等。从这里你的代码不应该取决于你有什么数据库)。您不需要了解您提到的课程(entitymanagerfactory sessionfactory transactionmanager)。简单的例子是:

List<MyBean> bean = (List<MyBean>)em.createNamedQuery("select * from mydb").getResultList();

运行select *查询并直接获取MyBean类型对象应该很容易,没有任何显式转换(这就是hibernate的用途)。

类似于插入:

em.persist(myBean);

其中myBean是为Hibernate注释的东西。

简要介绍一下交易,我发现最好在服务METHODS上注释@Transactional(你是在整个dao上做的)。