创建SpringSource工具套件(STS)休眠模板
-
12-10-2019 - |
题
我已经使用Spring Template项目创建了Hibernate项目。创建了两个域对象,一个junit测试,app-context.xml和persistence-context.xml。现在我注意到这条线
<jdbc:embedded-database id="dataSource"></jdbc:embedded-database>
并假设以下发生
- 使用默认的HQSL DB
两个创建的模型订单。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()); }
问题 ...
- 我是否正确地认为内存表是从域模型(顺序/项目)创建并映射的?因此,session.flush()将对象同步到物理(在内存表中)。
这些桌子是自动映射的,因为如果我执行以下操作
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也是如此,您需要使用属性/字段名称,而不是列名称)。
不隶属于 StackOverflow