RE: How to enforce Delete before Insert?

From: Bill Fan (bil..anscom.com.au)
Date: Fri Apr 28 2006 - 05:52:21 EDT

  • Next message: Philip Copeland: "java.sql.SQLException: No rows for 'payment_items'"

    Thanks Juergen! Can you still manage the db traction when you do delete and
    insert in separate context?

    I can force it to do the DELETE first if I execute commitChanges() after the
    deleteObjects statement...however, this could be potentially dangerous as
    what I'm trying to do here should be in a atomic db transaction.

    I guess I have to do it in the hard way, analyze the changes and do INSERT
    and DELETE accordingly.

    Cheers.

    -----Original Message-----
    From: Jürgen Saar [mailto:Juerge..Saar.org]
    Sent: Friday, 28 April 2006 5:40 PM
    To: cayenne-use..ncubator.apache.org
    Subject: Re: How to enforce Delete before Insert?

    This problem is well known to me.
    We do it the same way.
    It is much easyier because it is not neccessary
    to analyze for changes.

    Cayenne does not commit the changes in a fifo-logic.
    To solve this we use a separate context
    for delete and insert ...

    --- Juergen ---

    -----Ursprüngliche Nachricht-----

    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

    </textarea></td>
                    </tr>
            </table>
                    
                            
            
            
            <table border="0" cellspacing="0" cellpadding="0" width="100%">
                    <tr>
                            <td colspan="4"><img src="//img.web.de/v/p.gif"
    width="1" height="15" border="0" alt="" /></td>
                    </tr>
                    <tr>
                            
                            <td valign="top" class="a"><input class="a"
    type="submit" name="rv_do_correctmsg" value="Rechtschreibung"></td>
                            <td width="10"><img src="//img.web.de/v/p.gif"
    width="10" height="1" border="0" alt="" /></td>
                            <td class="b" valign="top"><select class="b"
    name="rv_lang">
                                    
                                                            <option
    value="deutsch" selected="selected">Deutsch</option>
                                            
                                                            <option
    value="british" >Englisch (England)</option>
                                            
                                                            <option
    value="english" >Englisch (Amerika)</option>
                                            
                                                            <option
    value="francais" >Französisch</option>
                                            
                                                            <option
    value="italian" >Italienisch</option>
                                            
                                                            <option
    value="espanol" >Spanisch</option>
                                            
                                                            <option
    value="catala" >Katalanisch</option>
                                            
                                                            <option
    value="portugues" >Portugiesisch (Portugal)</option>
                                            
                                                            <option value="br"
    >Portugiesisch (Brasilien)</option>
                                            
                                                            <option
    value="dansk" >Dänisch</option>
                                            
                                                            <option
    value="nederlands" >Holländisch</option>
                                            
                                                            <option
    value="svenska" >Schwedisch</option>
                                            
                                                            <option
    value="norsk" >Norwegisch</option>
                                            
                                                            <option
    value="czech" >Tschechisch</option>
                                            
                                                            <option
    value="polish" >Polnisch</option>
                                            
                                                            <option
    value="esperanto" >Esperanto</option>
                                            
                                                            <option
    value="slovak" >Slowakisch</option>
                                            </select></td>
                                    
                                            <td width="100%"> </td>
                                    
                    </tr>
            </table>

    <table cellpadding="0" cellspacing="0" border="0">
            <tr>
                    <td height="15"></td>
            </tr>
    </table>

            <table cellpadding="0" cellspacing="0" border="0" width="100%">
                    <tr>
                            <td class="b" bgcolor="#D6E3FE" height="17">
    <b>Anlage zu dieser E-Mail hinzufügen</b></td>
                    </tr>
            </table>
            <table cellpadding="1" cellspacing="0" border="0" width="100%"
    bgcolor="#D6E3FE">
                    <tr>
                            <td>
                                    <table cellpadding="0" cellspacing="0"
    border="0" width="100%" bgcolor="#F5F8FE"><tr><td height="7"><img
    src="//img.web.de/v/p.gif" width="1" height="1" border="0" alt=""
    /></td></tr></table>
                                    <table cellpadding="0" cellspacing="0"
    border="0" width="100%" bgcolor="#F5F8FE">
                                            <tr>
                                                    <td width="5"><img
    src="//img.web.de/v/p.gif" width="5" height="1" border="0" alt="" /></td>
                                                    <td class="b"><nobr><b>1.
    Schritt:</b> Datei auswählen</nobr></td>
                                                    <td width="8"><img
    src="//img.web.de/v/p.gif" width="8" height="1" border="0" alt="" /></td>
                                                    <td class="a" width="100%"
    colspan="3"><input class="a" name="rv_filename" type="file" size="38"
    /></td>
                                                    <td width="5"><img
    src="//img.web.de/v/p.gif" width="5" height="1" border="0" alt="" /></td>
                                            </tr>

                                            <tr>
                                                    <td colspan="5"
    height="5"><img src="//img.web.de/v/p.gif" width="1" height="5" border="0"
    alt="" /></td>
                                            </tr>
                                            <tr>
                                                    <td width="5"><img
    src="//img.web.de/v/p.gif" width="5" height="1" border="0" alt="" /></td>
                                                    <td class="b"><b>2.
    Schritt:</b> Datei hochladen</td>
                                                    <td width="8"><img
    src="//img.web.de/v/p.gif" width="8" height="1" border="0" alt="" /></td>
                                                    <td class="b"><input
    class="a" type="submit" name="rv_do_uploadatt" value="Hochladen"
    onClick="document.msgform.action='/online/logic/action.htm?si=1wlyZ.1fzngR.1
    ppQMc.c**&rv_do_uploadatt=yes&rv_mid=272890087';"/></td>
                                                    <td width="5"><img
    src="//img.web.de/v/p.gif" width="5" height="1" border="0" alt="" /></td>
                            <td align="right" class="b"><b><nobr><a
    href="/online/hilfe/jump/?si=1wlyZ.1fzngR.1ppQMc.c**&goto=/freemail/e-mail/a
    nlagen/hinzufuegen/" target="_blank"
    onClick="autoPopup('url=/online/hilfe/jump/?si=1wlyZ.1fzngR.1ppQMc.c**&goto=
    /freemail/e-mail/anlagen/hinzufuegen/','name=hilfe,width=752,height=500,scro
    llbars=yes, resizable=no'); return
    false;">Komfort-Upload</a></nobr></b></td>
                                                    <td width="5"><img
    src="//img.web.de/v/p.gif" width="5" height="1" border="0" alt="" /></td>
                        </tr>
                                    </table>
                                    <table cellpadding="0" cellspacing="0"
    border="0" width="100%" bgcolor="#F5F8FE"><tr><td height="7"><img
    src="//img.web.de/v/p.gif" width="1" height="1" border="0" alt=""
    /></td></tr></table>
                </td>
                    </tr>
            </table>

            <table cellpadding="1" cellspacing="0" border="0" width="100%"
    bgcolor="#ffffff">
                <tr>
                    <td class="b"><span style="color: red">Tipp:</span> <a
    href="/online/jump/dd/?si=1wlyZ.1fzngR.1ppQMc.c**&mc=freemai..l@emailsiz..
    chreiben.digita..lub@upgradefm&dienst=digitaledienste&goto=/freemail/club/e
    mailsize_ttc/">Anlagen bis 50 MB verschicken</a></td>
                </tr>
            </table>
        
    <table cellpadding="0" cellspacing="0" border="0">
            <tr>
                    <td height="15"><a name="box1"></a></td>
            </tr>
    </table>
    <div id="d10" style="display: block;">
            <table cellpadding="0" cellspacing="0" width="100%" border="0"
    bgcolor="#D6E3FE">
                    <tr>
                            <td class="b" height="17"
    onclick="showdiv('11');hidediv('10');" style="cursor:hand;"> <b>Empfänger
    per SMS auf diese Nachricht hinweisen</b></td>
                            <td class="a" align="right"
    onclick="showdiv('11');hidediv('10');" style="cursor:hand;"><a href="#box1"
    onclick="showdiv('11');hidediv('10');"><img
    src="//img.web.de/v/mail/0/iconsneu/ico_aus.gif" width="17" height="17"
    border="0" alt="" /></a></td>
                    </tr>
            </table>
    </div>
    <div id="d11" style="display: none;">
            <table cellpadding="0" cellspacing="0" width="100%" border="0"
    bgcolor="#D6E3FE">
                    <tr>
                            <td class="b" height="16"
    onclick="showdiv('10');hidediv('11');" style="cursor:hand;"> <b>Empfänger
    per SMS auf diese Nachricht hinweisen</b></td>
                            <td class="a" align="right"
    onclick="showdiv('10');hidediv('11');" style="cursor:hand;"><a href="#box1"
    onclick="showdiv('10'); hidediv('11');"><img
    src="//img.web.de/v/mail/0/iconsneu/ico_ein.gif" width="17" height="16"
    border="0" alt="" /></a></td>
                    </tr>
            </table>
            <table cellpadding="1" cellspacing="0" border="0" width="100%"
    bgcolor="#D6E3FE">
                    <tr>
                            <td valign="top">
                                    <table cellpadding="0" cellspacing="0"
    border="0" width="100%" bgcolor="#F5F8FE"><tr><td height="7"><img
    src="//img.web.de/v/p.gif" width="1" height="1" border="0" alt=""
    /></td></tr></table>
                                    <table cellpadding="2" cellspacing="0"
    border="0" width="100%" bgcolor="#F5F8FE">
                                            <tr>
                                                    <td class="b"
    align="right"><nobr> <b><a
    href="javascript:ShowKurier('kurier')">Handy-Nummer:</a></b> </nobr></td>
                                                    <td width="100%" class="b">
                                                            <input type="text"
    size="35" style="width:100%;" maxlength="255" name="rv_smsnumber" value=""
    />
                                                            <input type="hidden"
    name="rv_adrbuch" value="0" />
                                                            <input type="hidden"
    name="remsg_mail2sms" value="" /></td>
                                                    <td width="40" class="b"
    align="right"><nobr><a
    href="javascript:neues_fenster('/online/popup/tarife/frameset.htm?si=1wlyZ.1
    fzngR.1ppQMc.c**',588,375);"><b>Tarife & Club-Rabatte</b></a> </nobr></td>
                                            </tr>
                                    </table>
                                    <table cellpadding="0" cellspacing="0"
    border="0" width="100%" bgcolor="#F5F8FE"><tr><td height="7"><img
    src="//img.web.de/v/p.gif" width="1" height="1" border="0" alt=""
    /></td></tr></table>
                            </td>
                    </tr>
            </table>
    </div>

    <table cellpadding="0" cellspacing="0" border="0">
            <tr>
                    <td height="15"><a name="box2"></a></td>
            </tr>
    </table>
    <div id="d12" style="display: block;">
            <table cellpadding="0" cellspacing="0" border="0" width="100%"
    bgcolor="#D6E3FE">
                    <tr>
                            <td class="b" height="17"
    onclick="showdiv('13');hidediv('12');" style="cursor:hand;">
    <b>Sicherheit</b></td>
                            <td class="b" align="right"
    onclick="showdiv('13');hidediv('12');" style="cursor:hand;"><a href="#box2"
    onclick="showdiv('13'); hidediv('12');"><img
    src="//img.web.de/v/mail/0/iconsneu/ico_aus.gif" width="17" height="17"
    border="0" alt="" /></a></td>
                    </tr>
            </table>
    </div>
    <div id="d13" style="display: none;">
            <table cellpadding="0" cellspacing="0" border="0" width="100%"
    bgcolor="#D6E3FE">
                    <tr>
                            <td class="b" height="16"
    onclick="showdiv('12');hidediv('13');" style="cursor:hand;">
    <b>Sicherheit</b></td>
                            <td class="a" align="right"
    onclick="showdiv('12');hidediv('13');" style="cursor:hand;"><a href="#box2"
    onclick="showdiv('12'); hidediv('13');"><img
    src="//img.web.de/v/mail/0/iconsneu/ico_ein.gif" width="17" height="16"
    border="0" alt="" /></a></td>
                    </tr>
            </table>
            <table cellpadding="1" cellspacing="0" border="0" width="100%"
    bgcolor="#D6E3FE">
                    <tr>
                            <td valign="top">
                                    <table cellpadding="0" cellspacing="0"
    border="0" width="100%" bgcolor="#F5F8FE"><tr><td height="7"><img
    src="//img.web.de/v/p.gif" width="1" height="1" border="0" alt=""
    /></td></tr></table>
                                    <table cellpadding="2" cellspacing="0"
    border="0" width="100%" bgcolor="#F5F8FE">
                                            <tr>
                                                    <td class="b" width="150">
    <b>Digitale Unterschrift:</b></td>
                                                    <td class="b" width="25">
                                                    
                                                            <input
    type="checkbox" name="rv_sign" value="on" />
                                                    </td>
                                                    <td class="b">diese
    Nachricht mit meinem Zertifikat digital unterschreiben</td>
                            <td><img src="//img.web.de/v/p.gif" width="1"
    height="1" border="0" alt="" /></td>
                                            </tr>
                                            <tr>
                                                    <td class="b">
    <b>Verschlüsselung:</b></td>
                                                    <td class="b">
                                                            
            
    <input type="checkbox" name="rv_enc" value="on" />
                                                            </td>
                                                    <td class="b">diese
    Nachricht verschlüsseln
                                                    
                                                            <select class="b"
    name="rv_strength">
                                                                    <option
    VALUE="128">normal (128 Bit)</option>
                                                                    <option
    VALUE="des">mittel (168 Bit)</option>
                                                                    <option
    VALUE="aes">stark (256 Bit)</option>
                                                            </select>
                                                    
                                                    
                                                    
                                                    </td>
                            <td align="right" class="b"><a
    href="http://pc-sicherheit.web.de/" target="_blank">Sicherheit bei
    WEB.DE</a> <br /></td>
                                            </tr>
                                    </table>
                                    <table cellpadding="0" cellspacing="0"
    border="0" width="100%" bgcolor="#F5F8FE"><tr><td height="7"><img
    src="//img.web.de/v/p.gif" width="1" height="1" border="0" alt=""
    /></td></tr></table>
                            </td>
                    </tr>
            </table>
    </div>

    <table cellpadding="0" cellspacing="0" border="0">
            <tr>
                    <td height="15"><a name="box3"></a></td>
            </tr>
    </table>

    <div id="d14" style="display: block;">
            <table cellpadding="0" cellspacing="0" border="0" width="100%"
    bgcolor="#D6E3FE">
                    <tr>
                            <td class="b" height="17"
    onclick="showdiv('15');hidediv('14');" style="cursor:hand;"> <b>Meine
    Visitenkarte</b></td>
                            <td class="a" align="right"
    onclick="showdiv('15');hidediv('14');" style="cursor:hand;"><a href="#box3"
    onclick="showdiv('15'); hidediv('14');"><img
    src="//img.web.de/v/mail/0/iconsneu/ico_aus.gif" width="17" height="17"
    border="0" alt="" /></a></td>
                    </tr>
            </table>
    </div>
    <div id="d15" style="display: none;">
            <table cellpadding="0" cellspacing="0" border="0" width="100%"
    bgcolor="#D6E3FE">
                    <tr>
                            <td class="b" height="16"
    onclick="showdiv('14');hidediv('15');" style="cursor:hand;"> <b>Meine
    Visitenkarte</b></td>
                            <td class="a" align="right"
    onclick="showdiv('14');hidediv('15');" style="cursor:hand;"><a href="#box3"
    onclick="showdiv('14'); hidediv('15');"><img
    src="//img.web.de/v/mail/0/iconsneu/ico_ein.gif" width="17" height="16"
    border="0" alt="" /></a></td>
                    </tr>
            </table>
            <table cellpadding="1" cellspacing="0" border="0" width="100%"
    bgcolor="#D6E3FE">
                    <tr>
                            <td>
                                    <table cellpadding="0" cellspacing="0"
    border="0" width="100%" bgcolor="#F5F8FE"><tr><td height="7"><img
    src="//img.web.de/v/p.gif" width="1" height="1" border="0" alt=""
    /></td></tr></table>
                                    <table cellpadding="0" cellspacing="0"
    border="0" width="100%" bgcolor="#F5F8FE">
                                            
                            <tr>
                                                            <td width="5"><img
    src="//img.web.de/v/p.gif" width="5" height="1" border="0" alt="" /></td>
                                                        <td width="38"><img
    src="//img.web.de/v/mail/iconsneu/ico_visitenkarte_kl.gif" border="0"
    width="38" height="24" alt="" /></td>
                                                        <td width="5"><img
    src="//img.web.de/v/p.gif" width="5" height="1" border="0" alt="" /></td>
                                                            <td class="b"
    width="20"><input type="checkbox" class="a" name="rv_do_vcard" value="vcard"
    /></td>
                                                            <td width="8"><img
    src="//img.web.de/v/p.gif" width="8" height="1" border="0" alt="" /></td>
                                                        <td
    class="b"><nobr>Meine Visitenkarte anhängen</nobr></td>
                                <td width="100%" align="right"><input
    type="submit" class="a" style="width:200px;" name="editvcard" value="Meine
    Visitenkarte bearbeiten" /></td>
                                                            <td width="5"><img
    src="//img.web.de/v/p.gif" width="5" height="1" border="0" alt="" /></td>
                            </tr>
                                                    
                                                            
                                    </table>
                                    <table cellpadding="0" cellspacing="0"
    border="0" width="100%" bgcolor="#F5F8FE"><tr><td height="7"><img
    src="//img.web.de/v/p.gif" width="1" height="1" border="0" alt=""
    /></td></tr></table>
                            </td>
                    </tr>
            </table>
    </div>

                    <table border="0" cellspacing="0" cellpadding="0">
                            <tr>
                                    <td colspan="3" height="15"></td>
                            </tr>
                    </table>
            
                    <table border="0" cellspacing="0" cellpadding="0">
                    
                            <tr>
                                    <td colspan="3">
                        <table border="0" cellspacing="0" cellpadding="0">
                            <tr>
                                <td class="a" valign="middle"><input class="a"
    type="submit" name="rv_do_send" value="Senden" accesskey="s" /></td>
                                <td width="10"></td>
                                <td class="a" valign="middle"><input class="a"
    type="submit" name="rv_do_savedraft" value="Als Entwurf
    speichern" style="width:140px;" /></td>
                            </tr>
                        </table>
                    </td>
                            </tr>
                    
                    </table>
            
                    <table border="0" cellspacing="0" cellpadding="0">
                            <tr>
                                    <td height="15"></td>
                            </tr>
                    </table>
                    
                            <table border="0" cellspacing="0" cellpadding="0"
    width="100%">
                                    <tr>
                                            <td>
                                                    
                                            </td>
                                    </tr>
                            </table>
                    
            </form>
            <script language="JavaScript" type="text/javascript"><!--
                    document.msgform.rv_js.value = "yes";
          // var base = document.msgform;
            //alert(base.getElementsByTagName('input').length);
            //--></script>

                    <table width="100%" cellspacing="0" cellpadding="0"
    border="0" align="center">
            
            <tr>
                    <td>
    <script type="text/javascript" src="//img.web.de/v/c/popup3.js"></script>
    <center>
    <table border="0" cellpadding="0" cellspacing="0" width="100%">
        <tr><td height="15"></td></tr>
        <tr><td height="1" bgcolor="#888888"><img src="//img.web.de/v/p.gif"
    width="1" height="1" border="0" alt=""></td></tr>
        <tr><td height="10"></td></tr>
    </table>
    <table width="100%" cellpadding="0" cellspacing="0" border="0">
    <tr>
            <td class="a" align="center" valign="middle"><a
    href="http://r.web.de/f/common/foot/t/hp/impressum/u/d2ViLmRlL0ltcHJlc3N1bS8
    _/c/Um2OR$De1Tl2" target="_blank"
    onclick="autoPopup('url=http://r.web.de/f/common/foot/t/hp/impressum/u/d2ViL
    mRlL0ltcHJlc3N1bS8_/c/Um2OR$De1Tl2','name=headset,width=500,height=451,scrol
    lbars=no, resizable=no'); return false;">Impressum</a> - <a
    href="http://r.web.de/f/common/foot/t/webdede/home/u/d2ViZGUuZGU_/c/PBwC1YdG
    0EdC" target="_blank">WEB.DE GmbH</a> - <a
            
    href="http://r.web.de/f/common/foot/t/press/home/u/cHJlc3NlLndlYi5kZQ__/c/Aq
    grH5PGYkQh" target="_blank">Presse</a> - <a
            
    href="http://r.web.de/f/common/foot/t/advertising/home/u/YWR2ZXJ0aXNpbmcud2V
    iLmRlLw__/c/NDILSHiLGXWC" target="_blank">Werbung</a> - <a
            
    href="http://r.web.de/f/common/foot/t/jobs/home/u/am9icy53ZWIuZGU_/c/rsI2zWn
    jWwrY" target="_blank"><b>Jobs</b></a></td>
    </tr>
    </table>
    </center>
    <br>

    </td>
            </tr>
    </table>
    </BODY></HTML>
    _______________________________________________________________
    SMS schreiben mit WEB.DE FreeMail - einfach, schnell und
    kostenguenstig. Jetzt gleich testen! http://f.web.de/?mc=021192



    This archive was generated by hypermail 2.0.0 : Fri Apr 28 2006 - 05:53:02 EDT