【问题标题】:HibernateTemplate Save Not Throwing Exception when trying to insert duplicate Key row尝试插入重复的键行时,HibernateTemplate Save Not Throwing Exception
【发布时间】: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() 只是更新数据库行。

【问题讨论】:

    标签: java hibernate spring orm


    【解决方案1】:

    第二个save 是 ingored,因为您正在保存已保存的 CustomerOrder 的同一实例(即持久对象)。如果您尝试使用相同的 id 保存不同的实例(即瞬态对象),则会出现异常。

    【讨论】:

    • 谢谢。这就说得通了。我使用了不同的实例,但出现了异常。有趣!!!
    猜你喜欢
    • 2017-02-14
    • 1970-01-01
    • 2021-06-19
    • 2014-08-01
    • 1970-01-01
    • 2019-09-21
    • 2021-12-01
    • 1970-01-01
    • 2011-10-24
    相关资源
    最近更新 更多