创建SpringSource工具套件(STS)休眠模板

时间:2011-01-19 07:29:19

标签: java hibernate spring sts-springsourcetoolsuite

我使用Spring Template Project创建了Hibernate项目。创建了两个域对象,一个JUnit测试,一个app-context.xml和一个persistence-context.xml。现在我注意到了这一行

  

<jdbc:embedded-database id="dataSource"></jdbc:embedded-database>

并假设发生以下情况

  1. 使用默认的HQSL db
  2. 两个创建的模型Order.java&amp; Item.java将自动在内存表T_ORDER和T_ITEM中创建,这些将根据对象上的注释进行映射。在自动创建的类中,其中一个测试方法如下

    @Test
    @Transactional
    public void testSaveAndGet() throws Exception {
        Session session = sessionFactory.getCurrentSession();
        Order order = new Order();
        order.getItems().add(new Item());
        session.save(order);
        session.flush();
        // Otherwise the query returns the existing order
        // (and we didn't set the parent in the item)...
        session.clear();
        Order other = (Order) session.get(Order.class, order.getId());
        assertEquals(1, other.getItems().size());
        assertEquals(other, other.getItems().iterator().next().getOrder());
    }
    
  3. 问题......

    1. 我是否认为内存表是从域模型(Order / Item)创建并映射的?因此session.flush()将对象同步到物理(在内存表中)....
    2. 这些表是否自动映射,因为如果我执行以下操作

      session.save(order);
      session.flush();
      session.clear();
      Order other = (Order) session
         .createQuery("from T_ORDER where ORDER_ID =: orderid")
         .setLong("orderid", order.getId())
         .uniqueResult();
      
    3. 我得到例外......

      org.hibernate.hql.ast.[B]QuerySyntaxException[/B]: \
      T_ORDER is not mapped [from T_ORDER where ORDER_ID =: orderid]
      ............
      ............
      

      如果这些表没有自动映射,那么首先如何刷新工作?

1 个答案:

答案 0 :(得分:1)

表创建是Hibernate(以及其他JPA程序员)的一项功能。它在应用程序/测试开始时发生。它与任何查询无关。即使您只是开始测试,运行并配置了Hibernate,它也可以创建表。

如果Hibernate创建表,则删除旧表,依此类推,取决于其配置:属性:hibernate.hbm2ddl.auto用于hibernate启动时的操作。例如,值update将不添加现有的表和列。

更多详细信息,请参阅documentation

您的例外 当您使用Hibernate并编写hibernate查询语句时,您必须使用HQL而不是SQL。 - 主要区别在于HQL基于类而不是表。因此,在您的情况下,您不能使用T_ORDER,而是使用Order(同样适用于ID,您需要使用属性/字段名称,但不能使用列名称。)