HibernateTemplate Исключение «Сохранить, не выбрасывая» при попытке вставить повторяющуюся строку ключа - PullRequest
0 голосов
/ 06 июля 2010

Я использую класс Spring HibernateDAOSupport для обработки моего DAO.Моя проблема заключается в том, что когда я использую getHibernateSupport (). save (order), когда порядок уже существует в базе данных, он просто обновляет строку базы данных вместо того, чтобы выдавать какое-то исключение.:

<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 Ответ

1 голос
/ 06 июля 2010

Второй save введен, потому что вы сохраняете тот же экземпляр CustomerOrder, который уже был сохранен (то есть постоянный объект).Если вы попытаетесь сохранить другой экземпляр (то есть временный объект) с тем же идентификатором, вы получите исключение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...