尝试插入重复的键行时,HibernateTemplate Save Not Throwing Exception
Posted
技术标签:
【中文标题】尝试插入重复的键行时,HibernateTemplate Save Not Throwing Exception【英文标题】:HibernateTemplate Save Not Throwing Exception when trying to insert duplicate Key row 【发布时间】:2010-07-06 11:07:26 【问题描述】:我正在使用 Spring 的 HibernateDAOSupport 类来处理我的 DAO。 我的问题是当我在数据库中已经存在订单时使用 getHibernateSupport().save(order) 时,它只是更新数据库行而不是抛出某种异常。
我的 Hibernate hbm.xml 文件是:
<hibernate-mapping>
<class name="com.shopping.db.CustomerOrder" table="CUSTOMERORDER" schema="PUBLIC">
<id name="orderID" type="long">
<column name="ORDERID" length="50" />
</id>
<many-to-one name="customer" class="com.shopping.db.Customer" fetch="select">
<column name="USERNAME" length="50" not-null="true" />
</many-to-one>
<property name="status" type="string">
<column name="STATUS" length="50" not-null="true" />
</property>
<property name="totalCost" type="float">
<column name="TOTALCOST" precision="0" scale="0" not-null="true" />
</property>
<property name="orderDate" type="java.sql.Date">
<column name="ORDERDATE" not-null="true" />
</property>
</class>
</hibernate-mapping>
我的 DAO 代码是:
public void createDBOrder(CustomerOrder order, List<OrderItem> orderItems)
getHibernateTemplate().save(order);
for (OrderItem item : orderItems)
getHibernateTemplate().save(item);
getHibernateTemplate().flush();
我的测试方法如下:
@Test
public void testCreateDBOrder()
int ordersCount = countRowsInTable("CUSTOMERORDER");
int orderItemsCount = countRowsInTable("ORDERITEM");
// Check for row count before insertion.
assertEquals(1, ordersCount);
assertEquals(1, orderItemsCount);
CustomerOrder order = new CustomerOrder(3, dataAccessObject
.getCustomerByName("Oussama"), "PENDING", 200, new Date(new Long(
"61191781200000")));
OrderItem item = new OrderItem(333, dataAccessObject.getProductByID("Apple iPhone"), order, 3);
OrderItem item2 = new OrderItem(444, dataAccessObject.getProductByID("DV2000"), order, 2);
List<OrderItem> items = new ArrayList<OrderItem>();
items.add(item);
items.add(item2);
dataAccessObject.createDBOrder(order, items);
ordersCount = countRowsInTable("CUSTOMERORDER");
orderItemsCount = countRowsInTable("ORDERITEM");
// Check for row count after insertion.
assertEquals(2, ordersCount);
assertEquals(3, orderItemsCount);
assertEquals(3, dataAccessObject.getOrderByID(3).getOrderID());
assertEquals(2, dataAccessObject.getOrderItemByOrderID(3).size());
order.setStatus("SHIPPED");
// Check for creating a order with the same ID.
dataAccessObject.createDBOrder(order, items);
assertEquals("SHIPPED", dataAccessObject.getOrderByID(3).getStatus());
ordersCount = countRowsInTable("CUSTOMERORDER");
// Check for row count after insertion.
//assertEquals(3, ordersCount);
如果由于主键已经存在而引发异常,为什么 getHibernateTemplate().save() 只是更新数据库行。
【问题讨论】:
【参考方案1】:第二个save
是 ingored,因为您正在保存已保存的 CustomerOrder
的同一实例(即持久对象)。如果您尝试使用相同的 id 保存不同的实例(即瞬态对象),则会出现异常。
【讨论】:
谢谢。这就说得通了。我使用了不同的实例,但出现了异常。有趣!!!以上是关于尝试插入重复的键行时,HibernateTemplate Save Not Throwing Exception的主要内容,如果未能解决你的问题,请参考以下文章