blob: 8e9aa0770c3d2ee49695695721241d3045bf80e2 [file] [log] [blame]
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
<meta http-equiv="Content-Style-Type" content="text/css" />
<meta http-equiv="Content-Script-Type" content="text/javascript" />
<title>@Multitenant | EclipseLink 2.4.x Java Persistence API (JPA) Extensions Reference</title>
<meta name="generator" content="Oracle DARB XHTML Converter (Mode = document) - Version 1.0.11" />
<meta name="date" content="2013-07-12T8:36:30Z" />
<meta name="robots" content="noarchive" />
<meta name="doctitle" content="@Multitenant" />
<meta name="relnum" content="Release 2.4" />
<link rel="stylesheet" type="text/css" href="../../../dcommon/style.css" media="screen" />
<link rel="copyright" href="http://www.eclipse.org/org/documents/epl-v10.php" title="Copyright" type="text/html" />
<link rel="start" href="../../index.htm" title="Home" type="text/html" />
<link rel="contents" href="toc.htm" title="Contents" type="text/html" />
<link rel="prev" href="a_mapkeyconvert.htm" title="Previous" type="text/html" />
<link rel="next" href="a_mutable.htm" title="Next" type="text/html" />
<!-- START: Disqus --><script type="text/javascript"> var disqus_developer = 0; </script><!-- END: Disqus --><!-- START: Sharethis --><script type="text/javascript">var switchTo5x=true;</script><script type="text/javascript" src="http://w.sharethis.com/button/buttons.js"></script><script type="text/javascript" src="http://s.sharethis.com/loader.js"></script> <!-- END: Sharethis --></head>
<body bgcolor="#FFFFFF"><iframe id="docheader" frameborder="0" framemargin="0" scrolling="no" src="../../../dcommon/header.html"></iframe><script src="http://www.google.com/jsapi" type="text/javascript"></script><script type="text/javascript"> google.load('search', '1', {language : 'en'}); google.setOnLoadCallback(function() { var customSearchOptions = {}; var googleAnalyticsOptions = {}; googleAnalyticsOptions['queryParameter'] = 'q'; googleAnalyticsOptions['categoryParameter'] = ''; customSearchOptions['googleAnalyticsOptions'] = googleAnalyticsOptions; var customSearchControl = new google.search.CustomSearchControl( '016171230611334810008:4sqnhke2any', customSearchOptions); customSearchControl.setResultSetSize(google.search.Search.FILTERED_CSE_RESULTSET); var options = new google.search.DrawOptions(); options.setSearchFormRoot('cse-search-form'); customSearchControl.draw('cse', options); }, true);</script><link rel="stylesheet" href="http://www.google.com/cse/style/look/default.css" type="text/css" /><div id="cse" style="width:100%;"></div>
<div class="header"><a id="top" name="top"></a>
<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
<tr>
<td align="left" valign="top"><div class="booktitle">Java Persistence API (JPA) Extensions Reference for EclipseLink,
Release 2.4</div></td>
<td valign="bottom" align="right" width="144">
<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
<tr>
<td>&nbsp;</td>
<td align="center" valign="top"><a href="toc.htm"><img src="../../../dcommon/images/contents.png" alt="Go To Table Of Contents" border="0" height="16" width="16" /><br />
<span class="mini">Contents</span></a></td><td>&nbsp;</td><td align="center"><a href="../../../" target="_top" class="external text" title="Other searches" rel="nofollow"><img src="../../../dcommon/images/search.png" alt="Search" style="border:0;" /><br /><span class="mini">Other&nbsp;Searches</span></a></td><td>&nbsp;</td><td align="center"><a href="../../eclipselink_jpa_extensions.pdf" title="PDF" target="_blank"><img src="../../../dcommon/images/pdf_icon.png" style="padding-right:5px;border:0" alt="PDF"><br /><span class="mini">PDF</span></a></td><td align="center"><a href="#disqus_thread" title="Comments""><img src="../../../dcommon/images/comments.png" style="padding-right:5px;border:0" alt="Comments"><br /><span class="mini">Comments</span></a>
</tr>
</table>
</td>
</tr>
</table>
<hr />
<table class="navigation simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100" align="center">
<tr>
<td align="center"><a href="a_mapkeyconvert.htm"><img src="../../../dcommon/images/larrow.png" alt="Previous" border="0" height="16" width="16" /></a></td>
<td align="center"><a href="a_mutable.htm"><img src="../../../dcommon/images/rarrow.png" alt="Next" border="0" height="16" width="16" /></a></td>
<td>&nbsp;</td>
</tr>
</table>
</div>
<!-- class="header" -->
<div class="ind"><!-- End Header --><a id="BABIEJGD" name="BABIEJGD"></a><a id="TLJPA707" name="TLJPA707"></a>
<hr />
<div class="refsect1">
<h2 class="refsect1"><font face="arial, helvetica, sans-serif" color="#330099">@Multitenant</font></h2>
<p>The <code>@Multitenant</code> annotation specifies that a given entity is shared among multiple tenants of an application. The multitenant type specifies how the data for these entities are to be stored on the database for each tenant. Multitenancy can be specified at the entity or mapped superclass level.</p>
<a id="sthref186" name="sthref186"></a>
<p><strong><br /><span class="refsubsect">Annotation Elements</span></strong></p>
<p><a href="#CHDGJGDC">Table 2-32</a> describes this annotation's elements.</p>
<div class="tblhruleformalwide"><a id="TLJPA708" name="TLJPA708"></a><a id="sthref187" name="sthref187"></a><a id="CHDGJGDC" name="CHDGJGDC"></a>
<p><strong><em><font face="arial, helvetica, sans-serif">Table 2-32 @Multitenant Annotation Elements</font></em></strong></p>
<table class="HRuleFormalWide" title="@Multitenant Annotation Elements" summary="This table describes the list of attributes for this annotation." dir="ltr" border="1" width="100%" frame="hsides" rules="rows" cellpadding="3" cellspacing="0">
<col width="31%" />
<col width="*" />
<col width="28%" />
<thead>
<tr align="left" valign="top">
<th align="left" valign="bottom" id="r1c1-t41"><font face="Arial, Helvetica, sans-serif"><strong>Annotation Element</strong></font></th>
<th align="left" valign="bottom" id="r1c2-t41"><font face="Arial, Helvetica, sans-serif"><strong>Description</strong></font></th>
<th align="left" valign="bottom" id="r1c3-t41"><font face="Arial, Helvetica, sans-serif"><strong>Default</strong></font></th>
</tr>
</thead>
<tbody>
<tr align="left" valign="top">
<td align="left" id="r2c1-t41" headers="r1c1-t41">
<p><code>boolean includeCriteria</code></p>
</td>
<td align="left" headers="r2c1-t41 r1c2-t41">
<p>Indicates if the database requires the tenant criteria to be added to the <code>SELECT</code>, <code>UPDATE</code>, and <code>DELETE</code> queries.</p>
</td>
<td align="left" headers="r2c1-t41 r1c3-t41">
<p><code>true</code></p>
</td>
</tr>
<tr align="left" valign="top">
<td align="left" id="r3c1-t41" headers="r1c1-t41">
<p><code>MultitenantType value</code></p>
</td>
<td align="left" headers="r3c1-t41 r1c2-t41">
<p>Specifies the multitenant strategy to use: <code>SINGLE_TABLE</code>, <code>TABLE_PER_TENANT</code>, or <code>VPD</code>.</p>
</td>
<td align="left" headers="r3c1-t41 r1c3-t41">
<p><code>SINGLE_TABLE</code></p>
</td>
</tr>
</tbody>
</table>
<br /></div>
<!-- class="tblhruleformalwide" -->
<a id="sthref188" name="sthref188"></a>
<p><strong><br /><span class="refsubsect">Usage</span></strong></p>
<p>To use the <code>@Multitenant</code> annotation, include the annotation with an <code>@Entity</code> or <code>@MappedSuperclass</code> annotation. For example:</p>
<pre xml:space="preserve" class="oac_no_warn">
@Entity
@Multitenant
...
public class Employee() {
...
}
</pre>
<p>Three types of multitenancy are available:</p>
<ul>
<li>
<p><a href="#BABICDGI">Single-Table Multitenancy</a></p>
</li>
<li>
<p><a href="#BABEGBIJ">Table-Per-Tenanat Multitenancy</a></p>
</li>
<li>
<p><a href="#CHDBFBGI">VPD Multitenancy</a></p>
</li>
</ul>
<a id="sthref189" name="sthref189"></a>
<p><strong><font face="arial, helvetica, sans-serif" color="#330099">Example</font></strong></p>
<p><a href="#BABEHCGI">Example 2-58</a> shows a simple example of a <code>@Multitenant</code> annotation. In this example, the <strong>Player</strong> entity has rows for multiple tenants stored in its default <code>PLAYER</code> table and that the default <code>TENANT_ID</code> column is used as a discriminator along with the default context property <code>eclipselink.tenant-id</code>.</p>
<div class="example"><a id="BABEHCGI" name="BABEHCGI"></a><a id="TLJPA54008" name="TLJPA54008"></a>
<p><strong><em><font face="arial, helvetica, sans-serif">Example 2-58 Minimal @Multitenant Annotation</font></em></strong></p>
<pre xml:space="preserve" class="oac_no_warn">
@Entity
@Multitenant
public class Player {
}
</pre>
<p>To have your application use a shared <code>EntityManagerFactory</code> and have the <code>EntityManager</code> be tenant specific, your runtime code might be:</p>
<pre xml:space="preserve" class="oac_no_warn">
Map&lt;String, Object&gt; emProperties = new HashMap&lt;String, Object&gt;();
emProperties.set("eclipselink.tenant-id", "HTHL");
EntityManager em = emf.createEntityManager(emProperties);
</pre></div>
<!-- class="example" -->
<p>Review <a href="#BABICDGI">"Single-Table Multitenancy"</a>, <a href="#BABEGBIJ">"Table-Per-Tenanat Multitenancy"</a>, and <a href="#CHDBFBGI">"VPD Multitenancy"</a> for more detailed examples.</p>
<a id="BABICDGI" name="BABICDGI"></a><a id="TLJPA709" name="TLJPA709"></a>
<hr />
<h3 class="refsect2"><font face="arial, helvetica, sans-serif" color="#330099">Single-Table Multitenancy</font></h3>
<p>The <code>SINGLE_TABLE</code> multitenant type specifies that any table to which an entity or mapped superclass maps can include rows for multiple tenants. Access to tenant-specific rows is restricted to the tenant.</p>
<p>Tenant-specific rows are associated with the tenant by using tenant discriminator columns. The discriminator columns are used with application context values to limit what a persistence context can access.</p>
<p>The results of queries on the mapped tables are limited to the tenant discriminator value(s) provided as property values. This applies to all insert, update, and delete operations on the table. When multitenant metadata is applied at the mapped superclass level, it is applied to all subentities unless they specify their own multitenant metadata.</p>
<div align="center">
<div class="inftblnote"><br />
<table class="Note oac_no_warn" summary="" border="1" width="80%" frame="hsides" rules="groups" cellpadding="3" cellspacing="0">
<tbody>
<tr>
<td align="left">
<p class="note"><img src="../../../dcommon/images/note_icon.png" width="16" height="16" alt="Note" style="vertical-align:middle;padding-right:5px;" />Note:</p>
<p>In the context of single-table multitenancy, &ldquo;single-table&rdquo; means multiple tenants can share a single table, and each tenant's data is distinguished from other tenants' data via the discriminator column(s). It is possible to use multiple tables with single-table multitenancy; but in that case, an entity's persisted data is stored in multiple tables (<code>Table</code> and <code>SecondaryTable</code>), and multiple tenants can share all the tables.</p>
</td>
</tr>
</tbody>
</table>
<br /></div>
<!-- class="inftblnote" --></div>
<p>For more information how to use tenant discriminator columns to configure single-table multitenancy, see <a href="a_tenantdiscriminatorcolumn.htm#CHECIDGH">"@TenantDiscriminatorColumn"</a>.</p>
<a id="TLJPA710" name="TLJPA710"></a><a id="sthref190" name="sthref190"></a>
<h4 class="refsect3"><br /><span class="refsubsect">Examples</span></h4>
<p>The following example uses <code>@Multitenant</code>, <code>@TenantDiscriminatorColumn</code>, and a context property to define single-table multitenancy on an entity:</p>
<div class="example"><a id="TLJPA711" name="TLJPA711"></a><a id="sthref191" name="sthref191"></a>
<p><strong><em><font face="arial, helvetica, sans-serif">Example 2-59 Example Using @Multitenant</font></em></strong></p>
<pre xml:space="preserve" class="oac_no_warn">
@Entity
@Table(name=&ldquo;EMP&rdquo;)
@Multitenant(SINGLE_TABLE)
@TenantDiscriminatorColumn(name = &ldquo;TENANT_ID&rdquo;,
contextProperty = "employee-tenant.id")
</pre></div>
<!-- class="example" -->
<p>The following example uses the <code>&lt;multitenant&gt;</code> element to specify a minimal single-table multitenancy. <code>SINGLE_TABLE</code> is the default value and therefore does not have to be specified.</p>
<div class="example"><a id="TLJPA712" name="TLJPA712"></a><a id="sthref192" name="sthref192"></a>
<p><strong><em><font face="arial, helvetica, sans-serif">Example 2-60 Example Using &lt;multitenant&gt;</font></em></strong></p>
<pre xml:space="preserve" class="oac_no_warn">
&lt;entity class="model.Employee"&gt;
&lt;multitenant/&gt;
&lt;table name="EMP"/&gt;
...
&lt;/entity&gt;
</pre></div>
<!-- class="example" -->
<a id="BABEGBIJ" name="BABEGBIJ"></a><a id="TLJPA713" name="TLJPA713"></a>
<hr />
<h3 class="refsect2"><font face="arial, helvetica, sans-serif" color="#330099">Table-Per-Tenanat Multitenancy</font></h3>
<p>The <code>TABLE_PER_TENANT</code> multitenant type specifies that the table(s) (<code>Table</code> and <code>SecondaryTable</code>) for an entity are tenant-specific tables based on the tenant context.. Access to these tables is restricted to the specified tenant. Relationships within an entity that use a join or collection table are also assumed to exist within that context.</p>
<p>As with other multitenant types, table-per-tenant multitenancy can be specified at the entity or mapped superclass level. At the entity level, a tenant context property must be provided on each entity manager after a transaction has started.</p>
<p>Table-per-tenant entities can be mixed with other multitenant-type entities within the same persistence unit.</p>
<p>All read, insert, update, and delete operations for the tenant apply only to the tenant's table(s).</p>
<p>Tenants share the same server session by default. The table-per-tenant identifier must be set or updated for each entity manager. ID generation is assumed to be unique across all the tenants in a table-per-tenant strategy.</p>
<p>To configure table-per-tenant multitenancy, you must specify:</p>
<ul>
<li>
<p>A table-per-tenant property to identify the user. This can be set per entity manager, or it can be set at the entity manager factory to isolate table-per-tenant per persistence unit.)</p>
</li>
<li>
<p>A tenant table discriminator to identify and isolate the tenant's tables from other tenants' tables. The discriminator types are <code>SCHEMA</code>, <code>SUFFIX</code>, and <code>PREFIX</code>. For more information about tenant discriminator types, see <a href="a_tenanttablediscriminator.htm#CHDFJJEC">"@TenantTableDiscriminator"</a>.</p>
</li>
</ul>
<a id="TLJPA714" name="TLJPA714"></a><a id="sthref193" name="sthref193"></a>
<h4 class="refsect3"><br /><span class="refsubsect">Examples</span></h4>
<p>The following example shows the <code>@Multitenant</code> annotation used to define table-per-tenant multitenancy on an entity. <code>@TenantTableDiscriminator(SCHEMA)</code> specifies that the discriminator table is identified by schema.</p>
<div class="example"><a id="TLJPA715" name="TLJPA715"></a><a id="sthref194" name="sthref194"></a>
<p><strong><em><font face="arial, helvetica, sans-serif">Example 2-61 Example Using @Multitenant with @TenantTableDiscriminator</font></em></strong></p>
<pre xml:space="preserve" class="oac_no_warn">
@Entity
@Table(name=&ldquo;EMP&rdquo;)
@Multitenant(TABLE_PER_TENANT)
@TenantTableDiscriminator(SCHEMA)
public class Employee {
...
}
</pre></div>
<!-- class="example" -->
<p>The following example shows the <code>&lt;multitenant&gt;</code> element and the <code>&lt;tenant-table-discriminator&gt;</code> elements used to define a minimal table-per-tenant multitenancy.</p>
<div class="example"><a id="TLJPA716" name="TLJPA716"></a><a id="sthref195" name="sthref195"></a>
<p><strong><em><font face="arial, helvetica, sans-serif">Example 2-62 Example Using &lt;multitenant&gt; with &lt;tenant-table-discriminator&gt;</font></em></strong></p>
<pre xml:space="preserve" class="oac_no_warn">
&lt;entity class="Employee"&gt;
&lt;multitenant type="TABLE_PER_TENANT"&gt;
&lt;tenant-table-discriminator type="SCHEMA"/&gt;
&lt;/multitenant&gt;
&lt;table name="EMP"&gt;
...
&lt;/entity&gt;
</pre></div>
<!-- class="example" -->
<a id="CHDBFBGI" name="CHDBFBGI"></a><a id="TLJPA717" name="TLJPA717"></a>
<hr />
<h3 class="refsect2"><font face="arial, helvetica, sans-serif" color="#330099">VPD Multitenancy</font></h3>
<p>The <code>VPD</code> (Virtual Private Database) multitanancy type specifies that the database handles the tenant filtering on all SELECT, UPDATE and DELETE queries. To use this type, the platform used with the persistence unit must support VPD.</p>
<p>To use EclipseLink VPD multitenancy, you must first configure VPD in the database and then specify multitenancy on the entity or mapped superclass, using <code>@Multitenant</code> and <code>@TenantDiscriminatorColumn</code>:</p>
<a id="TLJPA718" name="TLJPA718"></a><a id="sthref196" name="sthref196"></a>
<h4 class="refsect3"><br /><span class="refsubsect">Examples</span></h4>
<p><a href="#CHDIEFCF">Example 2-63</a> shows VPD multitenancy defined on an entity. As noted above, VPD in the database must also be configured to enable VPD multitenancy. In this case, the VPD database was configured to use the USER_ID column to restrict access to specified rows by specified clients. Therefore, <code>USER_ID</code> is also specified as the tenant discriminator column for the EclipseLink multitenant operations.</p>
<div class="example"><a id="CHDIEFCF" name="CHDIEFCF"></a><a id="TLJPA719" name="TLJPA719"></a>
<p><strong><em><font face="arial, helvetica, sans-serif">Example 2-63 Example Using @Multitenant(VPD)</font></em></strong></p>
<p>The following example shows</p>
<pre xml:space="preserve" class="oac_no_warn">
</pre></div>
<!-- class="example" -->
<pre xml:space="preserve" class="oac_no_warn">
@Entity
@Multitenant(VPD)
@TenantDiscriminatorColumn(name = "USER_ID", contextProperty = "tenant.id")
@Cacheable(false)
public class Task implements Serializable {
...
...
</pre>
<p>The following example shows...</p>
<div class="example"><a id="TLJPA720" name="TLJPA720"></a><a id="sthref197" name="sthref197"></a>
<p><strong><em><font face="arial, helvetica, sans-serif">Example 2-64 Example Using &lt;multitenant&gt;</font></em></strong></p>
<pre xml:space="preserve" class="oac_no_warn">
&lt;entity class="model.Employee"&gt;
&lt;multitenant type="VPD"&gt;
&lt;tenant-discriminator-column name="USER_ID" context-property="tenant.id"/&gt;
&lt;/multitenant&gt;
&lt;table name="EMPLOYEE"/&gt;
...
&lt;/entity&gt;
</pre></div>
<!-- class="example" -->
<a id="sthref198" name="sthref198"></a>
<p><strong><br /><span class="refsubsect">See Also</span></strong></p>
<ul>
<li>
<p><a href="a_tenantdiscriminatorcolumn.htm#CHECIDGH">"@TenantDiscriminatorColumn"</a></p>
</li>
<li>
<p><a href="a_tenantdiscrim_columns.htm#CECBEBEA">"@TenantDiscriminatorColumns"</a></p>
</li>
<li>
<p>"Using Multitenancy" in <em>Solutions Guide for EclispeLink</em></p>
</li>
<li>
<p>Multitenant Examples at <code><a href="http://wiki.eclipse.org/EclipseLink/Examples/JPA/Multitenant">http://wiki.eclipse.org/EclipseLink/Examples/JPA/Multitenant</a></code></p>
</li>
</ul>
</div>
<!-- class="refsect1" --></div>
<!-- class="ind" -->
<!-- Start Footer -->
<div class="footer">
<hr />
<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100%">
<col width="33%" />
<col width="*" />
<col width="33%" />
<tr>
<td valign="bottom">
<table class="navigation simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="100" align="center">
<col width="*" />
<col width="48%" />
<col width="48%" />
<tr>
<td>&nbsp;</td>
<td align="center"><a href="a_mapkeyconvert.htm"><img src="../../../dcommon/images/larrow.png" alt="Previous" border="0" height="16" width="16" /></a></td>
<td align="center"><a href="a_mutable.htm"><img src="../../../dcommon/images/rarrow.png" alt="Next" border="0" height="16" width="16" /></a></td>
</tr>
</table>
</td>
<td align="center" width="34%"><a href="http://www.eclipse.org/eclipselink/" title="EclipseLink home"><img src="../../../dcommon/images/ellogo.png" alt="EclipseLink" width="150" border="0" /></a><br />
</td>
<td valign="bottom" align="right">
<table class="simple oac_no_warn" summary="" cellspacing="0" cellpadding="0" width="225">
<tr>
<td>&nbsp;</td>
<td align="center" valign="top"><a href="toc.htm"><img src="../../../dcommon/images/contents.png" alt="Go To Table Of Contents" border="0" height="16" width="16" /><br />
<span class="mini">Contents</span></a></td><td>&nbsp;</td><td align="center"><a href="../../../" target="_top" class="external text" title="Other searches" rel="nofollow"><img src="../../../dcommon/images/search.png" alt="Search" style="border:0;" /><br /><span class="mini">Other&nbsp;Searches</span></a></td><td>&nbsp;</td><td align="center"><a href="../../eclipselink_jpa_extensions.pdf" title="PDF" target="_blank"><img src="../../../dcommon/images/pdf_icon.png" style="padding-right:5px;border:0" alt="PDF"><br /><span class="mini">PDF</span></a></td><td align="center"><a href="#disqus_thread" title="Comments""><img src="../../../dcommon/images/comments.png" style="padding-right:5px;border:0" alt="Comments"><br /><span class="mini">Comments</span></a>
</tr>
</table>
</td>
</tr>
</table>
</div>
<!-- class="footer" -->
<div id="copyright">Copyright &copy; 2012, 2013 by The Eclipse Foundation under the <a href="http://www.eclipse.org/org/documents/epl-v10.php">Eclipse Public License (EPL)</a><br /> <script type="text/javascript">var LastUpdated = document.lastModified;document.writeln ("Updated: " + LastUpdated);</script> </div><!-- START: Analytics --><script type="text/javascript"> var _gaq = _gaq || []; _gaq.push(['_setAccount', 'UA-1608008-2']); _gaq.push(['_trackPageview']); (function() { var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); })(); </script><!-- END: Analytics --><!-- START: Sharethis --><script>var options={ "publisher": "e2fe9e07-fab6-4f84-83ea-0991b429842c", "position": "right", "ad": { "visible": false, "openDelay": 5, "closeDelay": 0}};var st_hover_widget = new sharethis.widgets.hoverbuttons(options);</script><!-- END: Sharethis --><!-- START: Disqus --><div id="disqus_thread"></div> <script type="text/javascript"> var disqus_developer = 1;var disqus_shortname = 'eclipselinkdoc'; (function() { var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true; dsq.src = 'http://' + disqus_shortname + '.disqus.com/embed.js'; (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq); })(); </script> <noscript>Please enable JavaScript to view the <a href="http://disqus.com/?ref_noscript">comments powered by Disqus.</a></noscript> <a href="http://disqus.com" class="dsq-brlink">Comments powered by <span class="logo-disqus">Disqus</span></a><!-- END: Disqus --></body>
</html>