2010-07-06 3 views
0

J'utilise la classe HibernateDAOSupport de Spring pour gérer mon DAO. mon problème est que quand j'utilise getHibernateSupport(). Save (order) quand la commande existe déjà dans la base de données, il suffit de mettre à jour la ligne de la base de données au lieu de lancer une sorte d'exception.HibernateTemplate Save Not Throwing Exception lors de la tentative d'insertion d'une ligne de clé en double

mon fichier Mise en veille prolongée hbm.xml est:

<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> 

mon code DAO est:

public void createDBOrder(CustomerOrder order, List<OrderItem> orderItems) 
{ 
    getHibernateTemplate().save(order); 
    for (OrderItem item : orderItems) 
    { 
    getHibernateTemplate().save(item); 
    } 
    getHibernateTemplate().flush(); 
} 

ma méthode de test est la suivante:

@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); 
} 

Pourquoi getHibernateTemplate() .save() met simplement à jour la ligne de la base de données si une exception est générée car la clé primaire existe déjà.

Répondre

1

La seconde save est chargée, car vous enregistrez la même instance de CustomerOrder qui a déjà été enregistrée (c'est-à-dire un objet persistant). Si vous essayez d'enregistrer l'instance différente (c'est-à-dire un objet transitoire) avec le même identifiant, vous obtiendrez une exception.

+0

Merci. Ça a du sens. J'ai utilisé une instance différente et j'ai eu une exception. Intéressant!!! – Sammy

Questions connexes