<!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/42fa2b6156ed3e691e9e6aa2479cd500?d=mm&amp;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="java_osborn" id="email_java_osborn" href="https://hibernate.atlassian.net/secure/ViewProfile.jspa?name=java_osborn" style="color:#6c797f;; color: #3b73af; text-decoration: none">Jeff Osborn</a> <strong>commented</strong> on <a href="https://hibernate.atlassian.net/browse/HHH-5234" style="color: #3b73af; text-decoration: none"><img src="cid:jira-generated-image-static-newfeature-dcc1eda7-92d5-4c9a-a0ca-e6971183fa4f" height="16" width="16" border="0" align="absmiddle" alt="New Feature" /> HHH-5234</a> 
                            </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">
                                &nbsp;
                            </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 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-5234" style="color: #3b73af; text-decoration: none">Re: 2-phase load components</a> </span> 
                                        </td> 
                                    </tr> 
                                </table> 
                            </td> 
                        </tr> 
                        <tr> 
                            <td id="text-paragraph-pattern-top" class="email-content-main mobile-expand  comment-top-pattern" 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; border-bottom: none; padding-bottom: 0"> 
                                <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"> 
                                            <p style="margin: 10px 0 0 0">Steve,</p> 
                                            <p style="margin: 10px 0 0 0">I would love to contribute to this project, however, I think I have beat my head on the tooling stuff way too long. I could be half way to the Component two phase loading solution in the time I have wasted so far. This project is not compatable with Eclipse at all, the comments on the <a href="https://developer.jboss.org/wiki/ContributingToHibernateUsingEclipse" class="external-link" rel="nofollow" style="color: #3b73af; text-decoration: none">Contributing to Hibernate using Eclipse </a> and my experience bare witness to that.</p> 
                                            <p style="margin: 10px 0 0 0">What environment are you using?</p> 
                                            <p style="margin: 10px 0 0 0">Anyway, I will pass on my approach....</p> 
                                            <p style="margin: 10px 0 0 0">So my understanding of the infinite loop is this (My test case is a little more complicated, so I will try to simplify)....<br /> We have 4 objects:<br /> 1) Parent (who has a Set of EAGERly fetched ChildRlationship objects - one-to-many)<br /> 2) ParentChildRelationship objects (that have a many-to-one reference to the Parent and a many-to-one reference to the Child, thus the circular relationship) Note: The ParentChildRelationship has a composite Key of the Parent and Child, and an additional relationshipFlavor field.<br /> 3) ParentChildRelationship Id (the @IdClass object for ParentChildRelationship with a composite Key of the Parent and Child)<br /> 4) The Child object that does not need to reference anything.</p> 
                                            <p style="margin: 10px 0 0 0">The Scenario:<br /> We load the Parent object with a 'left join fetch' to the ParentChildRelationship (table) and a 'left join fetch' to the Child (table).<br /> So, in the Loader, when we hit extractKeysFromResultSet(...) (Loader line 760) we have at least three keys to build. <br /> 1) The Parent key, a LongType<br /> 2) The ParentChildRelationship key, a ComponentType referencing<br /> a) ManyToOneType referencing, a LongType (the Parent)<br /> b) ManyToOneType referencing, a LongType (the Child)<br /> 3) The Child key, a LongType</p> 
                                            <p style="margin: 10px 0 0 0">The problem:<br /> The problem comes when we try to resolve the keys (Loader line 839),<br /> 1) The parent key, no problem, resolves fine.<br /> 2) The ComponentType for the ParentChildRelationship. This tries to resolve and, as part of the composite resolve logic, we try to create a reference to the Parent object (which is actually part of the value of the key). The Parent object is not been added to the cache, so it hits the data source, resulting in roughly the original query, because the set is an EAGER fetch, and we call back into the extractKeysFromResultSet(...) with the same 3 keys to build again.... Infinite Loop<br /> I reproduced it in the debugger with this stack....</p> 
                                            <div class="code panel" style="border-width: 1px;; border: 1px solid #ccc; background: #f5f5f5; font-size: 12px; line-height: 1.333; font-family: monospace; border: 1px solid #ccc; -moz-border-radius: 3px 3px 3px 3px; border-radius: 3px 3px 3px 3px; margin: 9px 0">
                                                <div class="codeContent panelContent" style="padding: 9px 12px"> 
                                                    <pre class="code-java" style="margin: 10px 0 0 0; max-height: 30em; overflow: auto; white-space: pre-wrap; word-wrap: normal">
        SessionImpl.fireLoad(LoadEvent, LoadEventListener$LoadType) line: 1070        
        SessionImpl.internalLoad(<span class="code-object" style="color: #910091">String</span>, Serializable, <span class="code-object" style="color: #910091">boolean</span>, <span class="code-object" style="color: #910091">boolean</span>) line: 989        
        ManyToOneType(EntityType).resolveIdentifier(Serializable, SessionImplementor) line: 716        
        ManyToOneType(EntityType).resolve(<span class="code-object" style="color: #910091">Object</span>, SessionImplementor, <span class="code-object" style="color: #910091">Object</span>) line: 502        
        EmbeddedComponentType(ComponentType).resolve(<span class="code-object" style="color: #910091">Object</span>, SessionImplementor, <span class="code-object" style="color: #910091">Object</span>) line: 666        
        CascadeEntityLoader(Loader).extractKeysFromResultSet(Loadable[], QueryParameters, ResultSet, SessionImplementor, EntityKey[], LockMode[], List) line: 838        
        CascadeEntityLoader(Loader).getRowFromResultSet(ResultSet, SessionImplementor, QueryParameters, LockMode[], EntityKey, List, EntityKey[], <span class="code-object" style="color: #910091">boolean</span>, ResultTransformer) line: 720        
        CascadeEntityLoader(Loader).processResultSet(ResultSet, QueryParameters, SessionImplementor, <span class="code-object" style="color: #910091">boolean</span>, ResultTransformer, <span class="code-object" style="color: #910091">int</span>, List&lt;AfterLoadAction&gt;) line: 952        
        CascadeEntityLoader(Loader).doQuery(SessionImplementor, QueryParameters, <span class="code-object" style="color: #910091">boolean</span>, ResultTransformer) line: 920        
        CascadeEntityLoader(Loader).doQueryAndInitializeNonLazyCollections(SessionImplementor, QueryParameters, <span class="code-object" style="color: #910091">boolean</span>, ResultTransformer) line: 354        
        CascadeEntityLoader(Loader).doQueryAndInitializeNonLazyCollections(SessionImplementor, QueryParameters, <span class="code-object" style="color: #910091">boolean</span>) line: 324        
        CascadeEntityLoader(Loader).loadEntity(SessionImplementor, <span class="code-object" style="color: #910091">Object</span>, Type, <span class="code-object" style="color: #910091">Object</span>, <span class="code-object" style="color: #910091">String</span>, Serializable, EntityPersister, LockOptions) line: 2148        
        CascadeEntityLoader(AbstractEntityLoader).load(SessionImplementor, <span class="code-object" style="color: #910091">Object</span>, <span class="code-object" style="color: #910091">Object</span>, Serializable, LockOptions) line: 78        
        CascadeEntityLoader(AbstractEntityLoader).load(Serializable, <span class="code-object" style="color: #910091">Object</span>, SessionImplementor, LockOptions) line: 68        
        SingleTableEntityPersister(AbstractEntityPersister).load(Serializable, <span class="code-object" style="color: #910091">Object</span>, LockOptions, SessionImplementor) line: 4126        
        DefaultLoadEventListener.loadFromDatasource(LoadEvent, EntityPersister, EntityKey, LoadEventListener$LoadType) line: 503        
        DefaultLoadEventListener.doLoad(LoadEvent, EntityPersister, EntityKey, LoadEventListener$LoadType) line: 468        
        DefaultLoadEventListener.load(LoadEvent, EntityPersister, EntityKey, LoadEventListener$LoadType) line: 213        
        DefaultLoadEventListener.proxyOrLoad(LoadEvent, EntityPersister, EntityKey, LoadEventListener$LoadType) line: 275        
        DefaultLoadEventListener.onLoad(LoadEvent, LoadEventListener$LoadType) line: 151        
        SessionImpl.fireLoad(LoadEvent, LoadEventListener$LoadType) line: 1070        
        SessionImpl.internalLoad(<span class="code-object" style="color: #910091">String</span>, Serializable, <span class="code-object" style="color: #910091">boolean</span>, <span class="code-object" style="color: #910091">boolean</span>) line: 989        
        ManyToOneType(EntityType).resolveIdentifier(Serializable, SessionImplementor) line: 716        
        ManyToOneType(EntityType).resolve(<span class="code-object" style="color: #910091">Object</span>, SessionImplementor, <span class="code-object" style="color: #910091">Object</span>) line: 502        
        EmbeddedComponentType(ComponentType).resolve(<span class="code-object" style="color: #910091">Object</span>, SessionImplementor, <span class="code-object" style="color: #910091">Object</span>) line: 666        
        CascadeEntityLoader(Loader).extractKeysFromResultSet(Loadable[], QueryParameters, ResultSet, SessionImplementor, EntityKey[], LockMode[], List) line: 838        
        CascadeEntityLoader(Loader).getRowFromResultSet(ResultSet, SessionImplementor, QueryParameters, LockMode[], EntityKey, List, EntityKey[], <span class="code-object" style="color: #910091">boolean</span>, ResultTransformer) line: 720        
        CascadeEntityLoader(Loader).processResultSet(ResultSet, QueryParameters, SessionImplementor, <span class="code-object" style="color: #910091">boolean</span>, ResultTransformer, <span class="code-object" style="color: #910091">int</span>, List&lt;AfterLoadAction&gt;) line: 952        
        CascadeEntityLoader(Loader).doQuery(SessionImplementor, QueryParameters, <span class="code-object" style="color: #910091">boolean</span>, ResultTransformer) line: 920        
        CascadeEntityLoader(Loader).doQueryAndInitializeNonLazyCollections(SessionImplementor, QueryParameters, <span class="code-object" style="color: #910091">boolean</span>, ResultTransformer) line: 354        
        CascadeEntityLoader(Loader).doQueryAndInitializeNonLazyCollections(SessionImplementor, QueryParameters, <span class="code-object" style="color: #910091">boolean</span>) line: 324        
        CascadeEntityLoader(Loader).loadEntity(SessionImplementor, <span class="code-object" style="color: #910091">Object</span>, Type, <span class="code-object" style="color: #910091">Object</span>, <span class="code-object" style="color: #910091">String</span>, Serializable, EntityPersister, LockOptions) line: 2148        
        CascadeEntityLoader(AbstractEntityLoader).load(SessionImplementor, <span class="code-object" style="color: #910091">Object</span>, <span class="code-object" style="color: #910091">Object</span>, Serializable, LockOptions) line: 78        
        CascadeEntityLoader(AbstractEntityLoader).load(Serializable, <span class="code-object" style="color: #910091">Object</span>, SessionImplementor, LockOptions) line: 68        
        SingleTableEntityPersister(AbstractEntityPersister).load(Serializable, <span class="code-object" style="color: #910091">Object</span>, LockOptions, SessionImplementor) line: 4126        
        DefaultLoadEventListener.loadFromDatasource(LoadEvent, EntityPersister, EntityKey, LoadEventListener$LoadType) line: 503        
        DefaultLoadEventListener.doLoad(LoadEvent, EntityPersister, EntityKey, LoadEventListener$LoadType) line: 468        
        DefaultLoadEventListener.load(LoadEvent, EntityPersister, EntityKey, LoadEventListener$LoadType) line: 213        
        DefaultLoadEventListener.proxyOrLoad(LoadEvent, EntityPersister, EntityKey, LoadEventListener$LoadType) line: 275        
        DefaultLoadEventListener.onLoad(LoadEvent, LoadEventListener$LoadType) line: 151        
        SessionImpl.fireLoad(LoadEvent, LoadEventListener$LoadType) line: 1070        
        SessionImpl.access$2000(SessionImpl, LoadEvent, LoadEventListener$LoadType) line: 176        
        SessionImpl$IdentifierLoadAccessImpl.load(Serializable) line: 2551        
        SessionImpl.get(<span class="code-object" style="color: #910091">String</span>, Serializable) line: 960        
        JpaMergeEventListener(DefaultMergeEventListener).entityIsDetached(MergeEvent, Map) line: 306        
        JpaMergeEventListener(DefaultMergeEventListener).onMerge(MergeEvent, Map) line: 186        
        JpaMergeEventListener(DefaultMergeEventListener).onMerge(MergeEvent) line: 85        
        SessionImpl.fireMerge(MergeEvent) line: 876        
        SessionImpl.merge(<span class="code-object" style="color: #910091">String</span>, <span class="code-object" style="color: #910091">Object</span>) line: 858        
        SessionImpl.merge(<span class="code-object" style="color: #910091">Object</span>) line: 863        
        EntityManagerImpl(AbstractEntityManagerImpl).merge(A) line: 1196        
        NativeMethodAccessorImpl.invoke0(Method, <span class="code-object" style="color: #910091">Object</span>, <span class="code-object" style="color: #910091">Object</span>[]) line: not available [<span class="code-keyword" style="color: #000091">native</span> method]        
        NativeMethodAccessorImpl.invoke(<span class="code-object" style="color: #910091">Object</span>, <span class="code-object" style="color: #910091">Object</span>[]) line: 62        
        DelegatingMethodAccessorImpl.invoke(<span class="code-object" style="color: #910091">Object</span>, <span class="code-object" style="color: #910091">Object</span>[]) line: 43        
        Method.invoke(<span class="code-object" style="color: #910091">Object</span>, <span class="code-object" style="color: #910091">Object</span>...) line: 483        
        SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(<span class="code-object" style="color: #910091">Object</span>, Method, <span class="code-object" style="color: #910091">Object</span>[]) line: 289        
        $Proxy51.merge(<span class="code-object" style="color: #910091">Object</span>) line: not available        
        SimpleJpaRepository&lt;T,ID&gt;.save(S) line: 396        
        NativeMethodAccessorImpl.invoke0(Method, <span class="code-object" style="color: #910091">Object</span>, <span class="code-object" style="color: #910091">Object</span>[]) line: not available [<span class="code-keyword" style="color: #000091">native</span> method]        
        NativeMethodAccessorImpl.invoke(<span class="code-object" style="color: #910091">Object</span>, <span class="code-object" style="color: #910091">Object</span>[]) line: 62        
        DelegatingMethodAccessorImpl.invoke(<span class="code-object" style="color: #910091">Object</span>, <span class="code-object" style="color: #910091">Object</span>[]) line: 43        
        Method.invoke(<span class="code-object" style="color: #910091">Object</span>, <span class="code-object" style="color: #910091">Object</span>...) line: 483        
        RepositoryFactorySupport$QueryExecutorMethodInterceptor.executeMethodOn(<span class="code-object" style="color: #910091">Object</span>, Method, <span class="code-object" style="color: #910091">Object</span>[]) line: 442        
        RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(MethodInvocation) line: 427        
        RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(MethodInvocation) line: 381        
        ReflectiveMethodInvocation.proceed() line: 179        
        RepositoryFactorySupport$DefaultMethodInvokingMethodInterceptor.invoke(MethodInvocation) line: 512        
        ReflectiveMethodInvocation.proceed() line: 179        
        TransactionInterceptor$1.proceedWithInvocation() line: 98        
        TransactionInterceptor(TransactionAspectSupport).invokeWithinTransaction(Method, <span class="code-object" style="color: #910091">Class</span>&lt;?&gt;, InvocationCallback) line: 266        
        TransactionInterceptor.invoke(MethodInvocation) line: 95        
        ReflectiveMethodInvocation.proceed() line: 179        
        PersistenceExceptionTranslationInterceptor.invoke(MethodInvocation) line: 136        
        ReflectiveMethodInvocation.proceed() line: 179        
        CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodIntercceptor.invoke(MethodInvocation) line: 111        
        ReflectiveMethodInvocation.proceed() line: 179        
        ExposeInvocationInterceptor.invoke(MethodInvocation) line: 92        
        ReflectiveMethodInvocation.proceed() line: 179        
        JdkDynamicAopProxy.invoke(<span class="code-object" style="color: #910091">Object</span>, Method, <span class="code-object" style="color: #910091">Object</span>[]) line: 207        
        $Proxy60.save(<span class="code-object" style="color: #910091">Object</span>) line: not available        
        AccountCreateTest.test() line: 86        
        NativeMethodAccessorImpl.invoke0(Method, <span class="code-object" style="color: #910091">Object</span>, <span class="code-object" style="color: #910091">Object</span>[]) line: not available [<span class="code-keyword" style="color: #000091">native</span> method]        
        NativeMethodAccessorImpl.invoke(<span class="code-object" style="color: #910091">Object</span>, <span class="code-object" style="color: #910091">Object</span>[]) line: 62        
        DelegatingMethodAccessorImpl.invoke(<span class="code-object" style="color: #910091">Object</span>, <span class="code-object" style="color: #910091">Object</span>[]) line: 43        
        Method.invoke(<span class="code-object" style="color: #910091">Object</span>, <span class="code-object" style="color: #910091">Object</span>...) line: 483        
        FrameworkMethod$1.runReflectiveCall() line: 47        
        FrameworkMethod$1(ReflectiveCallable).run() line: 12        
        FrameworkMethod.invokeExplosively(<span class="code-object" style="color: #910091">Object</span>, <span class="code-object" style="color: #910091">Object</span>...) line: 44        
        InvokeMethod.evaluate() line: 17        
        RunBefores.evaluate() line: 26        
        BlockJUnit4ClassRunner(ParentRunner&lt;T&gt;).runLeaf(Statement, Description, RunNotifier) line: 271        
        BlockJUnit4ClassRunner.runChild(FrameworkMethod, RunNotifier) line: 70        
        BlockJUnit4ClassRunner.runChild(<span class="code-object" style="color: #910091">Object</span>, RunNotifier) line: 50        
        ParentRunner$3.run() line: 238        
        ParentRunner$1.schedule(<span class="code-object" style="color: #910091">Runnable</span>) line: 63        
        BlockJUnit4ClassRunner(ParentRunner&lt;T&gt;).runChildren(RunNotifier) line: 236        
        ParentRunner&lt;T&gt;.access$000(ParentRunner, RunNotifier) line: 53        
        ParentRunner$2.evaluate() line: 229        
        BlockJUnit4ClassRunner(ParentRunner&lt;T&gt;).run(RunNotifier) line: 309        
        JUnit4TestClassReference(JUnit4TestReference).run(TestExecution) line: 50        
        TestExecution.run(ITestReference[]) line: 38        
        RemoteTestRunner.runTests(<span class="code-object" style="color: #910091">String</span>[], <span class="code-object" style="color: #910091">String</span>, TestExecution) line: 459        
        RemoteTestRunner.runTests(TestExecution) line: 675        
        RemoteTestRunner.run() line: 382        
        RemoteTestRunner.main(<span class="code-object" style="color: #910091">String</span>[]) line: 192        
</pre> 
                                                </div>
                                            </div> 
                                            <p style="margin: 10px 0 0 0">The good:<br /> This approach is great in that we do one call to the DB to get the results.<br /> The bad:<br /> We cannot resolve the Component Key i.e.. infinate loop</p> 
                                            <p style="margin: 10px 0 0 0">The Solution:<br /> 1) Long term, I think you are correct that a 2 phase load for Components is the right way to go.<br /> 2) Short term, If we detect the case where we are loading a Component (Composite Key) and the leaf level type that it reference (in this case the Parent's LongType), then defer the IdType.resolve(), and let Hibernate resolve it later with a second call to the DB.<br /> In this case, we are making more calls than needed, however it is simpler to implement than a 2 phase load for the Components. With only minor changes to extractKeysFromResultSet(), and the addition of two methods to detect the infinate loop condition.</p> 
                                            <p style="margin: 10px 0 0 0">The down side to solution #2 is that you make another hit on the database for the ParentChildRelationship when resolving the Component.</p> 
                                            <p style="margin: 10px 0 0 0">I have code for solution #2, and it works for all of my unit tests, however I am unable to verify it against the hibernate test suite, due to tooling issues <img class="emoticon" src="https://hibernate.atlassian.net/images/icons/emoticons/sad.gif" height="16" width="16" align="absmiddle" alt="" border="0" />. </p> 
                                            <p style="margin: 10px 0 0 0">I will be glad to share my code if you would like to look at it..... Let me know...</p> 
                                            <p style="margin: 10px 0 0 0">Thanks,</p> 
                                            <p style="margin: 10px 0 0 0">Jeff</p> 
                                        </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-5234#add-comment" target="_blank" title="Add Comment" style="color: #3b73af; text-decoration: none"> <img class="actions-pattern-action-icon-image" src="cid:jira-generated-image-static-comment-icon-b40295f3-6880-413f-ab70-aa44cda4825d" alt="Add Comment" title="Add Comment" 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-5234#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">
                                &nbsp;
                            </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.4-OD-15-055#64014-<span title="797c660868dfc4d690d8b76e2560e35770d95524" data-commit-id="797c660868dfc4d690d8b76e2560e35770d95524}">sha1:797c660</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="cid:jira-generated-image-static-footer-desktop-logo-07e0dd77-9a1d-47ba-abff-326cea78f40b" alt="Atlassian logo" title="Atlassian logo" width="169" height="36" class="image_fix" /> 
                                        </td> 
                                    </tr> 
                                </table> 
                            </td> 
                        </tr> 
                    </table> 
                </td> 
            </tr> 
        </table>   
    </body>
</html>