<style>
/* Changing the layout to use less space for mobiles */
@media screen and (max-device-width: 480px), screen and (-webkit-min-device-pixel-ratio: 2) {
    #email-body { min-width: 30em !important; }
    #email-page { padding: 8px !important; }
    #email-banner { padding: 8px 8px 0 8px !important; }
    #email-avatar { margin: 1px 8px 8px 0 !important; padding: 0 !important; }
    #email-fields { padding: 0 8px 8px 8px !important; }
    #email-gutter { width: 0 !important; }
}
</style>
<div id="email-body">
<table id="email-wrap" align="center" border="0" cellpadding="0" cellspacing="0" style="background-color:#f0f0f0;color:#000000;width:100%;">
    <tr valign="top">
        <td id="email-page" style="padding:16px !important;">
            <table align="center" border="0" cellpadding="0" cellspacing="0" style="background-color:#ffffff;border:1px solid #bbbbbb;color:#000000;width:100%;">
                <tr valign="top">
                    <td bgcolor="#3e4c4e" style="background-color:#3e4c4e;color:#ffffff;font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:12px;line-height:1;"><img src="https://www.jboss.org/dms/hibernate/images/jira/jiraheader_hibernate.png" alt="" style="vertical-align:top;" /></td>
                </tr><tr valign="top">
    <td id="email-banner" style="padding:32px 32px 0 32px;">
        
                
        
        
            <table align="left" border="0" cellpadding="0" cellspacing="0" width="100%" style="width:100%;">
    <tr valign="top">
        <td style="color:#505050;font-family:Arial,FreeSans,Helvetica,sans-serif;padding:0;">
                                        <img id="email-avatar" src="https://hibernate.onjira.com/secure/useravatar?ownerId=steve&avatarId=10346" alt="" height="48" width="48" border="0" align="left" style="padding:0;margin: 0 16px 16px 0;" />
                        <div id="email-action" style="padding: 0 0 8px 0;font-size:12px;line-height:18px;">
                                    <a class="user-hover" rel="steve" id="email_steve" href="https://hibernate.onjira.com/secure/ViewProfile.jspa?name=steve" style="color:#6c797f;">Steve Ebersole</a>
     created <img src="https://hibernate.onjira.com/images/icons/improvement.gif" height="16" width="16" border="0" align="absmiddle" alt="Improvement"> <a style='color:#6c797f;text-decoration:none;' href='https://hibernate.onjira.com/browse/HHH-7872'>HHH-7872</a>
            </div>
                        <div id="email-summary" style="font-size:16px;line-height:20px;padding:2px 0 16px 0;">
                <a style='color:#6c797f;text-decoration:none;' href='https://hibernate.onjira.com/browse/HHH-7872'><strong>Improved L2 cache storage of &quot;reference&quot; data</strong></a>
            </div>
                    </td>
    </tr>
</table>
    </td>
</tr>
<tr valign="top">
    <td id="email-fields" style="padding:0 32px 32px 32px;">
        <table border="0" cellpadding="0" cellspacing="0" style="padding:0;text-align:left;width:100%;" width="100%">
            <tr valign="top">
                <td id="email-gutter" style="width:64px;white-space:nowrap;"></td>
                <td>
                    <table border="0" cellpadding="0" cellspacing="0" width="100%">
                        <tr valign="top">
    <td style="color:#000000;font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:12px;padding:0 10px 10px 0;white-space:nowrap;">
        <strong style="font-weight:normal;color:#505050;">Issue Type:</strong>
    </td>
    <td style="color:#000000;font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:12px;padding:0 0 10px 0;width:100%;">
                <img src="https://hibernate.onjira.com/images/icons/improvement.gif" height="16" width="16" border="0" align="absmiddle" alt="Improvement">        Improvement
    </td>
</tr>                                                <tr valign="top">
    <td style="color:#000000;font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:12px;padding:0 10px 10px 0;white-space:nowrap;">
        <strong style="font-weight:normal;color:#505050;">Assignee:</strong>
    </td>
    <td style="color:#000000;font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:12px;padding:0 0 10px 0;width:100%;">
                    Unassigned            </td>
</tr>                                                <tr valign="top">
    <td style="color:#000000;font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:12px;padding:0 10px 10px 0;white-space:nowrap;">
        <strong style="font-weight:normal;color:#505050;">Components:</strong>
    </td>
    <td style="color:#000000;font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:12px;padding:0 0 10px 0;width:100%;">
                    caching (L2)            </td>
</tr>
                        <tr valign="top">
    <td style="color:#000000;font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:12px;padding:0 10px 10px 0;white-space:nowrap;">
        <strong style="font-weight:normal;color:#505050;">Created:</strong>
    </td>
    <td style="color:#000000;font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:12px;padding:0 0 10px 0;width:100%;">
        17/Dec/12 11:34 AM
    </td>
</tr>                        <tr valign="top">
    <td style="color:#000000;font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:12px;padding:0 10px 10px 0;white-space:nowrap;">
        <strong style="font-weight:normal;color:#505050;">Description:</strong>
    </td>
    <td style="color:#000000;font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:12px;padding:0 0 10px 0;width:100%;">
        <p style='margin-top:0;margin-bottom:10px;'>Currently, all data stored into the second level cache is handled the same way.  The data is first disasembled into a state array, that array is deep copiedand that deep copy is put into the cache.  The reverse is done for reading from the cache.  For example, take an entity named <tt>ZipCode</tt>:</p>

<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<pre class="code-java">@Entity
@Immutable
<span class="code-keyword">public</span> class ZipCode {
    @Id
    <span class="code-keyword">public</span> <span class="code-object">Integer</span> id;
    <span class="code-keyword">public</span> <span class="code-object">Integer</span> code;
    <span class="code-keyword">public</span> <span class="code-object">Integer</span> plus4;
}</pre>
</div></div>

<p style='margin-top:0;margin-bottom:10px;'>Currently, storing that into the second level cache would:</p>
<ol>
        <li>disasseble the ZipCode into its basic state as an array (<tt><span class="error">&#91;code,plus4&#93;</span></tt>)</li>
        <li>deepCopy that array<br/>
#push that array copy on to the cache</li>
</ol>


<p style='margin-top:0;margin-bottom:10px;'>All cacheable data that is mutable needs to continue to be handled this way.  </p>

<p style='margin-top:0;margin-bottom:10px;'>However, for immutable (aka "reference") data there are more efficient ways to store the information.  Within immutable data there is still a further distinction we need to make with regards to associations.  Does the reference data define associations (many-to-one, etc)?  </p>

<p style='margin-top:0;margin-bottom:10px;'>In the simpliest case, consider reference data with no associations like we have above with <tt>ZipCode</tt>.  Here it is feasible to store the <tt>ZipCode</tt> reference directly into the cache.   With a caveat... the developer needs to understand that in memory changes to this <tt>ZipCode</tt> would now directly "write through" to the cache.  Dangerous.</p>

<p style='margin-top:0;margin-bottom:10px;'>At the other extreme for cacheable reference data would be reference data with one or more associtions to mutable (transactional) data.  Here we absolutely would not be able to directly write the object instance out to the second level cache region.  We clearly need the disassembly.  However, the deepCopy is actually unnecessary in this case.  </p>

<p style='margin-top:0;margin-bottom:10px;'>In between we have a gray area with regard to cacheable reference data with associations to nothing but other immutable reference data, such as the case of <tt>ZipCode</tt> with reference to the <tt>State</tt> it belongs to:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<pre class="code-java">@Entity
@Immutable
<span class="code-keyword">public</span> class State {
    @Id
    <span class="code-keyword">private</span> <span class="code-object">Integer</span> id;
    ...
}

@Entity
@Immutable
<span class="code-keyword">public</span> class ZipCode {
    @Id
    <span class="code-keyword">public</span> <span class="code-object">Integer</span> id;
    <span class="code-keyword">public</span> <span class="code-object">Integer</span> code;
    <span class="code-keyword">public</span> <span class="code-object">Integer</span> plus4;
    @ManyToOne
    <span class="code-keyword">public</span> State state;
}</pre>
</div></div>

<p style='margin-top:0;margin-bottom:10px;'>Here it would be possible to cache <tt>ZipCode</tt> "whole".  Not sure yet though if that is what we want.</p>
    </td>
</tr>
                                                                                                <tr valign="top">
    <td style="color:#000000;font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:12px;padding:0 10px 10px 0;white-space:nowrap;">
        <strong style="font-weight:normal;color:#505050;">Project:</strong>
    </td>
    <td style="color:#000000;font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:12px;padding:0 0 10px 0;width:100%;">
        <a style="color:#6c797f;" href="https://hibernate.onjira.com/browse/HHH">Hibernate ORM</a>
    </td>
</tr>                                                <tr valign="top">
    <td style="color:#000000;font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:12px;padding:0 10px 10px 0;white-space:nowrap;">
        <strong style="font-weight:normal;color:#505050;">Priority:</strong>
    </td>
    <td style="color:#000000;font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:12px;padding:0 0 10px 0;width:100%;">
                <img src="https://hibernate.onjira.com/images/icons/priority_major.gif" height="16" width="16" border="0" align="absmiddle" alt="Major">        Major
    </td>
</tr>                        <tr valign="top">
    <td style="color:#000000;font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:12px;padding:0 10px 10px 0;white-space:nowrap;">
        <strong style="font-weight:normal;color:#505050;">Reporter:</strong>
    </td>
    <td style="color:#000000;font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:12px;padding:0 0 10px 0;width:100%;">
                                        <a class="user-hover" rel="steve" id="email_steve" href="https://hibernate.onjira.com/secure/ViewProfile.jspa?name=steve" style="color:#6c797f;">Steve Ebersole</a>
                </td>
</tr>                                                    
    
    
                        </table>
                </td>
            </tr>
        </table>
    </td>
</tr>













            </table>
        </td><!-- End #email-page -->
    </tr>
    <tr valign="top">
        <td style="color:#505050;font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:10px;line-height:14px;padding: 0 16px 16px 16px;text-align:center;">
            This message is automatically generated by JIRA.<br />
            If you think it was sent incorrectly, please contact your JIRA administrators<br />
            For more information on JIRA, see: <a style='color:#6c797f;' href='http://www.atlassian.com/software/jira'>http://www.atlassian.com/software/jira</a>
        </td>
    </tr>
</table><!-- End #email-wrap -->
</div><!-- End #email-body -->