我使用Spring Template Project创建了Hibernate项目。创建了两个域对象,一个JUnit测试,一个app-context.xml和一个persistence-context.xml。现在我注意到了这一行
<jdbc:embedded-database id="dataSource"></jdbc:embedded-database>
并假设发生以下情况
两个创建的模型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());
}
问题......
这些表是否自动映射,因为如果我执行以下操作
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]
............
............
如果这些表没有自动映射,那么首先如何刷新工作?
答案 0 :(得分:1)
表创建是Hibernate(以及其他JPA程序员)的一项功能。它在应用程序/测试开始时发生。它与任何查询无关。即使您只是开始测试,运行并配置了Hibernate,它也可以创建表。
如果Hibernate创建表,则删除旧表,依此类推,取决于其配置:属性:hibernate.hbm2ddl.auto
用于hibernate启动时的操作。例如,值update
将不添加现有的表和列。
更多详细信息,请参阅documentation。
您的例外
当您使用Hibernate并编写hibernate查询语句时,您必须使用HQL而不是SQL。 - 主要区别在于HQL基于类而不是表。因此,在您的情况下,您不能使用T_ORDER
,而是使用Order
(同样适用于ID,您需要使用属性/字段名称,但不能使用列名称。)