Re: How to enforce Delete before Insert?

From: Andrus Adamchik (andru..bjectstyle.org)
Date: Fri Apr 28 2006 - 09:04:36 EDT

  • Next message: Andrus Adamchik: "Re: How to enforce Delete before Insert?"

    Ho is the PK defined in ProductRelation? Looks like all three columns
    are a part of PK. If so why would the error be thrown - the rows you
    are deleting and inserting are not the same. I wonder if that's a
    SQLServer thing? Could you post the error.

    Andrus

    On Apr 27, 2006, at 9:00 AM, Bill Fan wrote:

    > Hi,
    >
    > I have a Product & a ProductRelation tables. When the ProductRelation
    > records for a product are managed in a web page, I'd like to delete
    > the
    > exiting records in the ProductRelation table for this product
    > first, then
    > insert the new one.
    >
    > I'm having trouble to do this with the following code. I got the
    > "Cannot
    > insert duplicate key in object ..." db error. The reason appears
    > that the
    > DELET statements appear after the INSERT statements from what I can
    > see in
    > the QueryLogger output. Could someone please help? I'm using
    > Cayenne 1.2B2.
    >
    >
    > The code:
    > =========
    > public void saveProductRelation(Product product, String
    > relatedProductId[], Type relationType)
    > {
    > // delete the existing records
    > log.debug("product.getProductRelationArray().size()=" +
    > product.getProductRelationArray().size());
    >
    > threadDataContext().deleteObjects(product.getProductRelationArray());
    >
    > if (relatedProductId.length > 0)
    > {
    > for (int i=0; i<relatedProductId.length; i++)
    > {
    > log.debug("relatedProductId[" + i + "]=" +
    > relatedProductId[i]);
    >
    > ProductRelation o = new ProductRelation();
    > threadDataContext().registerNewObject(o);
    > o.setToProduct(product);
    > o.setToProduct1((Product) objectForPK(Product.class, new
    > Integer(relatedProductId[i].trim())));
    > o.setToType(relationType);
    >
    > product.addToProductRelationArray(o);
    > }
    > }
    >
    > commitChanges();
    > }
    >
    >
    > The QueryLogger output:
    > =======================
    > dao.ProductDaoImpl.saveProductRelation(ProductDaoImpl.java:713) -
    > <relatedProductId[0]=9>
    > cayenne.access.QueryLogger.logQueryStart(QueryLogger.java:459) -
    > <--- will
    > run 2 queries.>
    > cayenne.access.QueryLogger.logBeginTransaction(QueryLogger.java:
    > 413) - <---
    > transaction started.>
    > cayenne.access.QueryLogger.logQuery(QueryLogger.java:336) - <INSERT
    > INTO
    > dbo.ProductRelation (ProductId, RelatedProductid, TypeId) VALUES
    > (?, ?, ?)>
    > cayenne.access.QueryLogger.logQueryParameters(QueryLogger.java:358) -
    > <[bind: 242, 9, 16]>
    > cayenne.access.QueryLogger.logUpdateCount(QueryLogger.java:404) - <===
    > updated 1 row.>
    > cayenne.access.QueryLogger.logQuery(QueryLogger.java:336) - <DELETE
    > FROM
    > dbo.ProductRelation WHERE ProductId = ? AND RelatedProductid = ?
    > AND TypeId
    > = ?>
    > cayenne.access.QueryLogger.logQueryParameters(QueryLogger.java:358) -
    > <[bind: 242, 222, 16]>
    >
    >
    > Many thanks in advace!
    >
    > Bill
    >
    >
    >



    This archive was generated by hypermail 2.0.0 : Fri Apr 28 2006 - 09:05:00 EDT