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

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

并假设以下发生

  1. 使用默认的HQSL DB
  2. 两个创建的模型订单。Java&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());
    }
    

问题 ...

  1. 我是否正确地认为内存表是从域模型(顺序/项目)创建并映射的?因此,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();
    

我有例外...

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

如果这些表不是自动映射的,那么Flush flusing首先是如何工作的?

有帮助吗?

解决方案

表创建是Hibernate(和其他JPA供应商)的功能。当应用程序/测试启动时,它发生。它与任何查询无关。即使您仅开始测试,冬眠运行和配置也可以创建表。

如果Hibernate创建了表,请旧掉一次,依此类推,取决于其配置:属性: hibernate.hbm2ddl.auto 如果冬眠开始,就可以使用它。例如值 update 将不添加现有表和列。

可以在 文档.

你的例外当您使用冬眠并编写Hibernate查询语句时,则必须使用HQL而不是SQL。 - 主要区别在于HQL基于类,但不基于表。因此,就您而言,您不得使用 T_ORDER, , 但 Order (对于ID也是如此,您需要使用属性/字段名称,而不是列名称)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top