<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0" /> <base href="https://hibernate.atlassian.net" />
<title>Message Title</title>
</head>
<body class="jira" style="color: #333; font-family: Arial, sans-serif; font-size: 14px; line-height: 1.429">
<table id="background-table" cellpadding="0" cellspacing="0" width="100%" style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt; background-color: #f5f5f5; border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt">
<!-- header here -->
<tr>
<td id="header-pattern-container" style="padding: 0px; border-collapse: collapse; padding: 10px 20px">
<table id="header-pattern" cellspacing="0" cellpadding="0" border="0" style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt">
<tr>
<td id="header-avatar-image-container" valign="top" style="padding: 0px; border-collapse: collapse; vertical-align: top; width: 32px; padding-right: 8px"> <img id="header-avatar-image" class="image_fix" src="https://secure.gravatar.com/avatar/df12d7792bd3b7be3a4edf12cabd58cb?d=mm&s=48" height="32" width="32" border="0" style="border-radius: 3px; vertical-align: top" />
</td>
<td id="header-text-container" valign="middle" style="padding: 0px; border-collapse: collapse; vertical-align: middle; font-family: Arial, sans-serif; font-size: 14px; line-height: 20px; mso-line-height-rule: exactly; mso-text-raise: 1px"> <a class="user-hover" rel="steve" id="email_steve" href="https://hibernate.atlassian.net/secure/ViewProfile.jspa?name=steve" style="color:#6c797f;; color: #3b73af; text-decoration: none">Steve Ebersole</a> <strong>updated</strong> an issue
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td id="email-content-container" style="padding: 0px; border-collapse: collapse; padding: 0 20px">
<table id="email-content-table" cellspacing="0" cellpadding="0" border="0" width="100%" style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt; border-spacing: 0; border-collapse: separate">
<tr>
<!-- there needs to be content in the cell for it to render in some clients -->
<td class="email-content-rounded-top mobile-expand" style="padding: 0px; border-collapse: collapse; color: #fff; padding: 0 15px 0 16px; height: 15px; background-color: #fff; border-left: 1px solid #ccc; border-top: 1px solid #ccc; border-right: 1px solid #ccc; border-bottom: 0; border-top-right-radius: 5px; border-top-left-radius: 5px; height: 10px; line-height: 10px; padding: 0 15px 0 16px; mso-line-height-rule: exactly">
</td>
</tr>
<tr>
<td class="email-content-main mobile-expand " style="padding: 0px; border-collapse: collapse; border-left: 1px solid #ccc; border-right: 1px solid #ccc; border-top: 0; border-bottom: 0; padding: 0 15px 0 16px; background-color: #fff">
<table class="page-title-pattern" cellspacing="0" cellpadding="0" border="0" width="100%" style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt">
<tr>
<td class="page-title-pattern-first-line " style="padding: 0px; border-collapse: collapse; font-family: Arial, sans-serif; font-size: 14px; padding-top: 10px"> <a href="https://hibernate.atlassian.net/browse/HHH" style="color: #3b73af; text-decoration: none">Hibernate ORM</a> / <a href="https://hibernate.atlassian.net/browse/HHH-7689" style="color: #3b73af; text-decoration: none"><img src="https://hibernate.atlassian.net/images/icons/issuetypes/bug.png" height="16" width="16" border="0" align="absmiddle" alt="Bug" style="vertical-align: text-bottom" /></a> <a href="https://hibernate.atlassian.net/browse/HHH-7689" style="color: #3b73af; text-decoration: none">HHH-7689</a>
</td>
</tr>
<tr>
<td style="vertical-align: top;; padding: 0px; border-collapse: collapse; padding-right: 5px; font-size: 20px; line-height: 30px; mso-line-height-rule: exactly" class="page-title-pattern-header-container"> <span class="page-title-pattern-header" style="font-family: Arial, sans-serif; padding: 0; font-size: 20px; line-height: 30px; mso-text-raise: 2px; mso-line-height-rule: exactly; vertical-align: middle"> <a href="https://hibernate.atlassian.net/browse/HHH-7689" style="color: #3b73af; text-decoration: none">Error executing batch should abort rest of batch for "cleanliness" sake</a> </span>
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td class="email-content-main mobile-expand " style="padding: 0px; border-collapse: collapse; border-left: 1px solid #ccc; border-right: 1px solid #ccc; border-top: 0; border-bottom: 0; padding: 0 15px 0 16px; background-color: #fff">
<table class="keyvalue-table" style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt">
<tr>
<th style="color: #707070; font: normal 14px/20px Arial, sans-serif; text-align: left; vertical-align: top; padding: 2px 0">
Change By:
</th>
<td style="padding: 0px; border-collapse: collapse; font: normal 14px/20px Arial, sans-serif; padding: 2px 0 2px 5px; vertical-align: top"> <a class="user-hover" rel="steve" id="email_steve" href="https://hibernate.atlassian.net/secure/ViewProfile.jspa?name=steve" style="color:#6c797f;; color: #3b73af; text-decoration: none">Steve Ebersole</a>
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td class="email-content-main mobile-expand issue-description-container" style="padding: 0px; border-collapse: collapse; border-left: 1px solid #ccc; border-right: 1px solid #ccc; border-top: 0; border-bottom: 0; padding: 0 15px 0 16px; background-color: #fff; padding-top: 5px; padding-bottom: 10px">
<table class="text-paragraph-pattern" cellspacing="0" cellpadding="0" border="0" width="100%" style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt; font-family: Arial, sans-serif; font-size: 14px; line-height: 20px; mso-line-height-rule: exactly; mso-text-raise: 2px">
<tr>
<td class="text-paragraph-pattern-container mobile-resize-text " style="padding: 0px; border-collapse: collapse; padding: 0 0 10px 0"> <span class="diffaddedchars" style="background-color:#ddfade;">When actually performing the execution of the "batched" statement (whether from {{BatchingBatch}} or {{NonBatchingBatch}}) any exception should cause the rest of the batch to be aborted.<br /><br />----<br />Original report:<br /><br /></span> <span class="diffcontext">I was going to log something similar to HHH-7688 but it's a bit different as that change only covers the NonBatchingBatch where in my case it was the BatchingBatch impl causing me the grief.</span> <span class="diffremovedchars" style="background-color: #ffe7e7; text-decoration:line-through;"><br /><br /></span> <span class="diffaddedchars" style="background-color:#ddfade;"><br /><br /></span> <span class="diffcontext">The full details got lost in my notes and it also involved using a SavePoint extension so I wasn't sure if I was inducing some of my own pain at the time but I think there's something there.</span> <span class="diffremovedchars" style="background-color: #ffe7e7; text-decoration:line-through;"><br /><br /></span> <span class="diffaddedchars" style="background-color:#ddfade;"><br /><br /></span> <span class="diffcontext">The complete details are a bit fuzzy but this is what I had recorded...</span> <span class="diffremovedchars" style="background-color: #ffe7e7; text-decoration:line-through;"><br /><br /></span> <span class="diffaddedchars" style="background-color:#ddfade;"><br /><br /></span> <span class="diffcontext">The abortBatch() in the JdbcCoordinatorImpl is only called when it encounters a SQLException. However, when executing the batch Hibernate catches the original SQLException and rethrows a different exception which causes the abortBatch() not to be called.</span> <span class="diffremovedchars" style="background-color: #ffe7e7; text-decoration:line-through;"><br /></span> <span class="diffaddedchars" style="background-color:#ddfade;"><br /></span> <span class="diffcontext">In the event that Hibernate got to the executeBatch() stage the worst that happens is that any registered batch listeners are not removed. Under a previous patch I ensured that the clearStatements() included a call to clear the batch.</span> <span class="diffremovedchars" style="background-color: #ffe7e7; text-decoration:line-through;"><br /><br /></span> <span class="diffaddedchars" style="background-color:#ddfade;"><br /><br /></span> <span class="diffcontext">However, if it gets to the point where the execute hasn't actually been called yet, i.e. a validation exception occurs then the batch isn't actually cleared until the session controlling the transaction is closed. This isn't usually an issue since the exception is typically bubbled up the stack and everything is rolled back. However, in our case, we have some SavePoint functionality that required a workaround. I believe Spring would also encounter the same sort of issue.</span> <span class="diffremovedchars" style="background-color: #ffe7e7; text-decoration:line-through;"><br /><br /></span> <span class="diffaddedchars" style="background-color:#ddfade;"><br /><br /></span> <span class="diffcontext">The statements like this from addToBatch() in BatchingBatch are what cause the abortBatch to get bypassed.</span> <span class="diffremovedchars" style="background-color: #ffe7e7; text-decoration:line-through;"><br /><br /></span> <span class="diffaddedchars" style="background-color:#ddfade;"><br /><br /></span> <span class="diffcontext">{code}</span> <span class="diffremovedchars" style="background-color: #ffe7e7; text-decoration:line-through;"><br /></span> <span class="diffaddedchars" style="background-color:#ddfade;"><br /></span> <span class="diffcontext">catch ( SQLException e ) {</span> <span class="diffremovedchars" style="background-color: #ffe7e7; text-decoration:line-through;"><br /></span> <span class="diffaddedchars" style="background-color:#ddfade;"><br /></span> <span class="diffcontext"> LOG.debugf( "SQLException escaped proxy", e );</span> <span class="diffremovedchars" style="background-color: #ffe7e7; text-decoration:line-through;"><br /></span> <span class="diffaddedchars" style="background-color:#ddfade;"><br /></span> <span class="diffcontext"> throw sqlExceptionHelper().convert( e, "could not perform addBatch", currentStatementSql );</span> <span class="diffremovedchars" style="background-color: #ffe7e7; text-decoration:line-through;"><br /></span> <span class="diffaddedchars" style="background-color:#ddfade;"><br /></span> <span class="diffcontext"> }</span> <span class="diffremovedchars" style="background-color: #ffe7e7; text-decoration:line-through;"><br /></span> <span class="diffaddedchars" style="background-color:#ddfade;"><br /></span> <span class="diffcontext">{code}</span> <span class="diffremovedchars" style="background-color: #ffe7e7; text-decoration:line-through;"><br /><br /></span> <span class="diffaddedchars" style="background-color:#ddfade;"><br /><br /></span> <span class="diffcontext">Then in places that are wrapping the addToBatchCall, i.e. the insert method of AbstractEntityPersister you end up with...</span> <span class="diffremovedchars" style="background-color: #ffe7e7; text-decoration:line-through;"><br /><br /></span> <span class="diffaddedchars" style="background-color:#ddfade;"><br /><br /></span> <span class="diffcontext">{code}</span> <span class="diffremovedchars" style="background-color: #ffe7e7; text-decoration:line-through;"><br /></span> <span class="diffaddedchars" style="background-color:#ddfade;"><br /></span> <span class="diffcontext"> catch ( SQLException e ) {</span> <span class="diffremovedchars" style="background-color: #ffe7e7; text-decoration:line-through;"><br /></span> <span class="diffaddedchars" style="background-color:#ddfade;"><br /></span> <span class="diffcontext"> if ( useBatch ) {</span> <span class="diffremovedchars" style="background-color: #ffe7e7; text-decoration:line-through;"><br /></span> <span class="diffaddedchars" style="background-color:#ddfade;"><br /></span> <span class="diffcontext"> session.getTransactionCoordinator().getJdbcCoordinator().abortBatch();</span> <span class="diffremovedchars" style="background-color: #ffe7e7; text-decoration:line-through;"><br /></span> <span class="diffaddedchars" style="background-color:#ddfade;"><br /></span> <span class="diffcontext"> }</span> <span class="diffremovedchars" style="background-color: #ffe7e7; text-decoration:line-through;"><br /></span> <span class="diffaddedchars" style="background-color:#ddfade;"><br /></span> <span class="diffcontext"> throw e;</span> <span class="diffremovedchars" style="background-color: #ffe7e7; text-decoration:line-through;"><br /></span> <span class="diffaddedchars" style="background-color:#ddfade;"><br /></span> <span class="diffcontext"> }</span> <span class="diffremovedchars" style="background-color: #ffe7e7; text-decoration:line-through;"><br /></span> <span class="diffaddedchars" style="background-color:#ddfade;"><br /></span> <span class="diffcontext">{code}</span> <span class="diffremovedchars" style="background-color: #ffe7e7; text-decoration:line-through;"><br /><br /></span> <span class="diffaddedchars" style="background-color:#ddfade;"><br /><br /></span> <span class="diffcontext">However, by this point it seems like the Exception has been rewrapped to a GenericJDBCException which doesn't extend from SQLException and blows out.</span> <span class="diffremovedchars" style="background-color: #ffe7e7; text-decoration:line-through;"><br /><br /></span> <span class="diffaddedchars" style="background-color:#ddfade;"><br /><br /></span> <span class="diffcontext">In my case I ended up catching the exception in my extension and manually calling it but I think the Spring guys use the same concept (I think it's how their nested transaction functionality works)</span>
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td class="email-content-main mobile-expand " style="padding: 0px; border-collapse: collapse; border-left: 1px solid #ccc; border-right: 1px solid #ccc; border-top: 0; border-bottom: 0; padding: 0 15px 0 16px; background-color: #fff">
<table id="actions-pattern" cellspacing="0" cellpadding="0" border="0" width="100%" style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt; font-family: Arial, sans-serif; font-size: 14px; line-height: 20px; mso-line-height-rule: exactly; mso-text-raise: 1px">
<tr>
<td id="actions-pattern-container" valign="middle" style="padding: 0px; border-collapse: collapse; padding: 10px 0 10px 24px; vertical-align: middle; padding-left: 0">
<table align="left" style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt">
<tr>
<td class="actions-pattern-action-icon-container" style="padding: 0px; border-collapse: collapse; font-family: Arial, sans-serif; font-size: 14px; line-height: 20px; mso-line-height-rule: exactly; mso-text-raise: 0px; vertical-align: middle"> <a href="https://hibernate.atlassian.net/browse/HHH-7689#add-comment" target="_blank" title="{getText($action.text)}" style="color: #3b73af; text-decoration: none"> <img class="actions-pattern-action-icon-image" src="https://hibernate.atlassian.net/images/mail/comment-icon.png" alt="Add Comment" title="{Add Comment}-icon" height="16" width="16" border="0" style="vertical-align: middle" /> </a>
</td>
<td class="actions-pattern-action-text-container" style="padding: 0px; border-collapse: collapse; font-family: Arial, sans-serif; font-size: 14px; line-height: 20px; mso-line-height-rule: exactly; mso-text-raise: 4px; padding-left: 5px"> <a href="https://hibernate.atlassian.net/browse/HHH-7689#add-comment" target="_blank" title="Add Comment" style="color: #3b73af; text-decoration: none">Add Comment</a>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
<!-- there needs to be content in the cell for it to render in some clients -->
<tr>
<td class="email-content-rounded-bottom mobile-expand" style="padding: 0px; border-collapse: collapse; color: #fff; padding: 0 15px 0 16px; height: 5px; line-height: 5px; background-color: #fff; border-top: 0; border-left: 1px solid #ccc; border-bottom: 1px solid #ccc; border-right: 1px solid #ccc; border-bottom-right-radius: 5px; border-bottom-left-radius: 5px; mso-line-height-rule: exactly">
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td id="footer-pattern" style="padding: 0px; border-collapse: collapse; padding: 12px 20px">
<table id="footer-pattern-container" cellspacing="0" cellpadding="0" border="0" style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt">
<tr>
<td id="footer-pattern-text" class="mobile-resize-text" width="100%" style="padding: 0px; border-collapse: collapse; color: #999; font-size: 12px; line-height: 18px; font-family: Arial, sans-serif; mso-line-height-rule: exactly; mso-text-raise: 2px">
This message was sent by Atlassian JIRA <span id="footer-build-information">(v6.1-OD-09-WN#6144-<span title="62dfc48b48ace9520c38e8a9da28a9bf6fe10e82" data-commit-id="62dfc48b48ace9520c38e8a9da28a9bf6fe10e82}">sha1:62dfc48</span>)</span>
</td>
<td id="footer-pattern-logo-desktop-container" valign="top" style="padding: 0px; border-collapse: collapse; padding-left: 20px; vertical-align: top">
<table style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt">
<tr>
<td id="footer-pattern-logo-desktop-padding" style="padding: 0px; border-collapse: collapse; padding-top: 3px"> <img id="footer-pattern-logo-desktop" src="https://hibernate.atlassian.net/images/mail/footer-desktop-logo.png" alt="Atlassian logo" title="Atlassian logo" width="169" height="36" class="image_fix" />
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
</body>
</html>