<!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/8b7eda9bb492b41a0e4f8ac70479db48?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="SGeoware" id="email_SGeoware" href="https://hibernate.atlassian.net/secure/ViewProfile.jspa?name=SGeoware" style="color:#6c797f;; color: #3b73af; text-decoration: none">Spencer</a> <strong>created</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-9208" style="color: #3b73af; text-decoration: none"><img src="cid:jira-generated-image-static-bug-70234bd4-01bf-427d-bcba-da6d6a0822d1" height="16" width="16" border="0" align="absmiddle" alt="Bug" style="vertical-align: text-bottom" /></a> <a href="https://hibernate.atlassian.net/browse/HHH-9208" style="color: #3b73af; text-decoration: none">HHH-9208</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-9208" style="color: #3b73af; text-decoration: none">Composite ID containing foreign Composite ID loading incorrectly.</a> </span>
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td class="email-content-main mobile-expand wrapper-special-margin" 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: 10px; padding-bottom: 5px">
<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">
Issue Type:
</th>
<td class="has-icon" style="padding: 0px; border-collapse: collapse; font: normal 14px/20px Arial, sans-serif; padding: 2px 0 2px 5px; vertical-align: top"> <img src="cid:jira-generated-image-static-bug-70234bd4-01bf-427d-bcba-da6d6a0822d1" height="16" width="16" border="0" align="absmiddle" alt="Bug" style="vertical-align: text-bottom" /> Bug
</td>
</tr>
<tr>
<th style="color: #707070; font: normal 14px/20px Arial, sans-serif; text-align: left; vertical-align: top; padding: 2px 0">
Affects Versions:
</th>
<td style="padding: 0px; border-collapse: collapse; font: normal 14px/20px Arial, sans-serif; padding: 2px 0 2px 5px; vertical-align: top">
4.2.12, 4.3.5
</td>
</tr>
<tr>
<th style="color: #707070; font: normal 14px/20px Arial, sans-serif; text-align: left; vertical-align: top; padding: 2px 0">
Assignee:
</th>
<td style="padding: 0px; border-collapse: collapse; font: normal 14px/20px Arial, sans-serif; padding: 2px 0 2px 5px; vertical-align: top">
Unassigned
</td>
</tr>
<tr>
<th style="color: #707070; font: normal 14px/20px Arial, sans-serif; text-align: left; vertical-align: top; padding: 2px 0">
Attachments:
</th>
<td style="padding: 0px; border-collapse: collapse; font: normal 14px/20px Arial, sans-serif; padding: 2px 0 2px 5px; vertical-align: top">
CompositeKey.sql, PrimaryCompositeKey.sql, PrimaryKey.sql
</td>
</tr>
<tr>
<th style="color: #707070; font: normal 14px/20px Arial, sans-serif; text-align: left; vertical-align: top; padding: 2px 0">
Components:
</th>
<td style="padding: 0px; border-collapse: collapse; font: normal 14px/20px Arial, sans-serif; padding: 2px 0 2px 5px; vertical-align: top">
core
</td>
</tr>
<tr>
<th style="color: #707070; font: normal 14px/20px Arial, sans-serif; text-align: left; vertical-align: top; padding: 2px 0">
Created:
</th>
<td style="padding: 0px; border-collapse: collapse; font: normal 14px/20px Arial, sans-serif; padding: 2px 0 2px 5px; vertical-align: top">
20/May/14 3:09 PM
</td>
</tr>
<tr>
<th style="color: #707070; font: normal 14px/20px Arial, sans-serif; text-align: left; vertical-align: top; padding: 2px 0">
Environment:
</th>
<td style="padding: 0px; border-collapse: collapse; font: normal 14px/20px Arial, sans-serif; padding: 2px 0 2px 5px; vertical-align: top">
Windows 7 64-bit, Java 1.6, Spring 4.0.4, SQL Server 2008 R2
</td>
</tr>
<tr>
<th style="color: #707070; font: normal 14px/20px Arial, sans-serif; text-align: left; vertical-align: top; padding: 2px 0">
Labels:
</th>
<td style="padding: 0px; border-collapse: collapse; font: normal 14px/20px Arial, sans-serif; padding: 2px 0 2px 5px; vertical-align: top">
hibernate core criteria
</td>
</tr>
<tr>
<th style="color: #707070; font: normal 14px/20px Arial, sans-serif; text-align: left; vertical-align: top; padding: 2px 0">
Priority:
</th>
<td class="has-icon" style="padding: 0px; border-collapse: collapse; font: normal 14px/20px Arial, sans-serif; padding: 2px 0 2px 5px; vertical-align: top"> <img src="cid:jira-generated-image-static-major-913e65ec-fe68-4e85-b0d8-13576a7a770a" height="16" width="16" border="0" align="absmiddle" alt="Major" style="vertical-align: text-bottom" /> Major
</td>
</tr>
<tr>
<th style="color: #707070; font: normal 14px/20px Arial, sans-serif; text-align: left; vertical-align: top; padding: 2px 0">
Reporter:
</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="SGeoware" id="email_SGeoware" href="https://hibernate.atlassian.net/secure/ViewProfile.jspa?name=SGeoware" style="color:#6c797f;; color: #3b73af; text-decoration: none">Spencer</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">
<p style="margin-top:0;margin-bottom:10px;; margin: 10px 0 0 0">After following an example (<a href="http://docs.jboss.org/hibernate/core/4.3/manual/en-US/html_single/#d5e2288" class="external-link" rel="nofollow" style="color: #3b73af; text-decoration: none">http://docs.jboss.org/hibernate/core/4.3/manual/en-US/html_single/#d5e2288</a>) on how to create a composite ID that contained a foreign composite ID, I ran into some issues with the data. Based on that example, the JPA supported method will be referred to as Option 1 (the one I want to use) and the other is Option 2. This issue is with Option 1.</p>
<p style="margin-top:0;margin-bottom:10px;; margin: 10px 0 0 0">The database and models were made to test various Hibernate scenarios, so I apologize if they are a bit harder to follow.</p>
<p style="margin-top:0;margin-bottom:10px;; margin: 10px 0 0 0">I have the following data (scripts have been attached to recreate):</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="codeHeader panelHeader" style="border-bottom-width: 1px;; border-bottom: 1px solid #ccc; padding: 9px 12px">
<b>PrimaryKey table</b>
</div>
<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">
id        description
0        PK0
</pre>
</div>
</div>
<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="codeHeader panelHeader" style="border-bottom-width: 1px;; border-bottom: 1px solid #ccc; padding: 9px 12px">
<b>CompositeKey table</b>
</div>
<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">
id1        id2        description
0        0        CK0
0        1        CK1
1        0        CK2
1        1        CK3
2        0        CK4
2        1        CK5
</pre>
</div>
</div>
<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="codeHeader panelHeader" style="border-bottom-width: 1px;; border-bottom: 1px solid #ccc; padding: 9px 12px">
<b>PrimaryCompositeKey table</b>
</div>
<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">
primaryId        compositeId1        compositeId2        description
0                0                0                PCK0
0                0                1                PCK1
0                1                0                PCK2
0                1                1                PCK3
0                2                0                PCK4
0                2                1                PCK5
</pre>
</div>
</div>
<p style="margin-top:0;margin-bottom:10px;; margin: 10px 0 0 0">We created a custom annotation to handle Hibernate @Entity defaults for our models:</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="codeHeader panelHeader" style="border-bottom-width: 1px;; border-bottom: 1px solid #ccc; padding: 9px 12px">
<b>HibernateDefaultEntity.java</b>
</div>
<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">
@Entity(dynamicUpdate = <span class="code-keyword" style="color: #000091">true</span>, optimisticLock = OptimisticLockType.ALL)
<span class="code-keyword" style="color: #000091">public</span> @<span class="code-keyword" style="color: #000091">interface</span> HibernateDefaultEntity {
<span class="code-comment" style="color: #808080">// Empty implementation
</span>}
</pre>
</div>
</div>
<p style="margin-top:0;margin-bottom:10px;; margin: 10px 0 0 0">and the following models:</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="codeHeader panelHeader" style="border-bottom-width: 1px;; border-bottom: 1px solid #ccc; padding: 9px 12px">
<b>PrimaryKeyModel.java</b>
</div>
<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">
@Entity
@HibernateDefaultEntity
@Table(name = <span class="code-quote" style="color: #009100">"PrimaryKey"</span>)
@Proxy(lazy = <span class="code-keyword" style="color: #000091">false</span>)
<span class="code-keyword" style="color: #000091">public</span> class PrimaryKeyModel <span class="code-keyword" style="color: #000091">implements</span> Serializable {
@Id
@Column(name = <span class="code-quote" style="color: #009100">"id"</span>)
<span class="code-keyword" style="color: #000091">public</span> <span class="code-object" style="color: #910091">Integer</span> getId() {
<span class="code-keyword" style="color: #000091">return</span> id;
}
<span class="code-keyword" style="color: #000091">public</span> void setId(<span class="code-object" style="color: #910091">Integer</span> id) {
<span class="code-keyword" style="color: #000091">this</span>.id = id;
}
@Column(name = <span class="code-quote" style="color: #009100">"description"</span>)
<span class="code-keyword" style="color: #000091">public</span> <span class="code-object" style="color: #910091">String</span> getDescription() {
<span class="code-keyword" style="color: #000091">return</span> description;
}
<span class="code-keyword" style="color: #000091">public</span> void setDescription(<span class="code-object" style="color: #910091">String</span> description) {
<span class="code-keyword" style="color: #000091">this</span>.description = description;
}
@Override
<span class="code-keyword" style="color: #000091">public</span> <span class="code-object" style="color: #910091">String</span> toString() {
<span class="code-keyword" style="color: #000091">return</span> <span class="code-quote" style="color: #009100">"PrimaryKeyModel{"</span> + <span class="code-quote" style="color: #009100">"id="</span> + id + <span class="code-quote" style="color: #009100">", description="</span> + description + '}';
}
<span class="code-comment" style="color: #808080">// Fields
</span> <span class="code-keyword" style="color: #000091">private</span> <span class="code-object" style="color: #910091">Integer</span> id;
<span class="code-keyword" style="color: #000091">private</span> <span class="code-object" style="color: #910091">String</span> description;
}
</pre>
</div>
</div>
<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="codeHeader panelHeader" style="border-bottom-width: 1px;; border-bottom: 1px solid #ccc; padding: 9px 12px">
<b>CompositeKeyModel.java</b>
</div>
<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">
@Entity
@HibernateDefaultEntity
@Table(name = <span class="code-quote" style="color: #009100">"CompositeKey"</span>)
@Proxy(lazy = <span class="code-keyword" style="color: #000091">false</span>)
<span class="code-keyword" style="color: #000091">public</span> class CompositeKeyModel <span class="code-keyword" style="color: #000091">implements</span> Serializable {
@EmbeddedId
<span class="code-keyword" style="color: #000091">public</span> CompositeKeyModelId getId() {
<span class="code-keyword" style="color: #000091">return</span> id;
}
<span class="code-keyword" style="color: #000091">public</span> void setId(CompositeKeyModelId id) {
<span class="code-keyword" style="color: #000091">this</span>.id = id;
}
@Column(name = <span class="code-quote" style="color: #009100">"description"</span>)
<span class="code-keyword" style="color: #000091">public</span> <span class="code-object" style="color: #910091">String</span> getDescription() {
<span class="code-keyword" style="color: #000091">return</span> description;
}
<span class="code-keyword" style="color: #000091">public</span> void setDescription(<span class="code-object" style="color: #910091">String</span> description) {
<span class="code-keyword" style="color: #000091">this</span>.description = description;
}
@Override
<span class="code-keyword" style="color: #000091">public</span> <span class="code-object" style="color: #910091">int</span> hashCode() {
<span class="code-object" style="color: #910091">int</span> hash = 5;
hash = 23 * hash + (<span class="code-keyword" style="color: #000091">this</span>.id != <span class="code-keyword" style="color: #000091">null</span> ? <span class="code-keyword" style="color: #000091">this</span>.id.hashCode() : 0);
<span class="code-keyword" style="color: #000091">return</span> hash;
}
@Override
<span class="code-keyword" style="color: #000091">public</span> <span class="code-object" style="color: #910091">boolean</span> equals(<span class="code-object" style="color: #910091">Object</span> obj) {
<span class="code-keyword" style="color: #000091">if</span> (obj == <span class="code-keyword" style="color: #000091">null</span>) {
<span class="code-keyword" style="color: #000091">return</span> <span class="code-keyword" style="color: #000091">false</span>;
}
<span class="code-keyword" style="color: #000091">if</span> (getClass() != obj.getClass()) {
<span class="code-keyword" style="color: #000091">return</span> <span class="code-keyword" style="color: #000091">false</span>;
}
<span class="code-keyword" style="color: #000091">final</span> CompositeKeyModel other = (CompositeKeyModel)obj;
<span class="code-keyword" style="color: #000091">return</span> <span class="code-keyword" style="color: #000091">this</span>.id == other.id || (<span class="code-keyword" style="color: #000091">this</span>.id != <span class="code-keyword" style="color: #000091">null</span> && <span class="code-keyword" style="color: #000091">this</span>.id.equals(other.id));
}
@Override
<span class="code-keyword" style="color: #000091">public</span> <span class="code-object" style="color: #910091">String</span> toString() {
<span class="code-keyword" style="color: #000091">return</span> <span class="code-quote" style="color: #009100">"CompositeKeyModel{"</span> + <span class="code-quote" style="color: #009100">"id="</span> + id + <span class="code-quote" style="color: #009100">", description="</span> + description + '}';
}
<span class="code-comment" style="color: #808080">// Fields
</span> <span class="code-keyword" style="color: #000091">private</span> CompositeKeyModelId id;
<span class="code-keyword" style="color: #000091">private</span> <span class="code-object" style="color: #910091">String</span> description;
}
</pre>
</div>
</div>
<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="codeHeader panelHeader" style="border-bottom-width: 1px;; border-bottom: 1px solid #ccc; padding: 9px 12px">
<b>CompositeKeyModelId.java</b>
</div>
<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">
@Embeddable
<span class="code-keyword" style="color: #000091">public</span> class CompositeKeyModelId <span class="code-keyword" style="color: #000091">implements</span> Serializable {
<span class="code-keyword" style="color: #000091">public</span> CompositeKeyModelId() {
}
<span class="code-keyword" style="color: #000091">public</span> CompositeKeyModelId(<span class="code-object" style="color: #910091">Integer</span> id1, <span class="code-object" style="color: #910091">Integer</span> id2) {
<span class="code-keyword" style="color: #000091">this</span>.id1 = id1;
<span class="code-keyword" style="color: #000091">this</span>.id2 = id2;
}
@Column(name = <span class="code-quote" style="color: #009100">"id1"</span>)
<span class="code-keyword" style="color: #000091">public</span> <span class="code-object" style="color: #910091">Integer</span> getId1() {
<span class="code-keyword" style="color: #000091">return</span> id1;
}
<span class="code-keyword" style="color: #000091">public</span> void setId1(<span class="code-object" style="color: #910091">Integer</span> id1) {
<span class="code-keyword" style="color: #000091">this</span>.id1 = id1;
}
@Column(name = <span class="code-quote" style="color: #009100">"id2"</span>)
<span class="code-keyword" style="color: #000091">public</span> <span class="code-object" style="color: #910091">Integer</span> getId2() {
<span class="code-keyword" style="color: #000091">return</span> id2;
}
<span class="code-keyword" style="color: #000091">public</span> void setId2(<span class="code-object" style="color: #910091">Integer</span> id2) {
<span class="code-keyword" style="color: #000091">this</span>.id2 = id2;
}
@Override
<span class="code-keyword" style="color: #000091">public</span> <span class="code-object" style="color: #910091">int</span> hashCode() {
<span class="code-object" style="color: #910091">int</span> hash = 5;
hash = 53 * hash + (<span class="code-keyword" style="color: #000091">this</span>.id1 != <span class="code-keyword" style="color: #000091">null</span> ? <span class="code-keyword" style="color: #000091">this</span>.id1.hashCode() : 0);
hash = 53 * hash + (<span class="code-keyword" style="color: #000091">this</span>.id2 != <span class="code-keyword" style="color: #000091">null</span> ? <span class="code-keyword" style="color: #000091">this</span>.id2.hashCode() : 0);
<span class="code-keyword" style="color: #000091">return</span> hash;
}
@Override
<span class="code-keyword" style="color: #000091">public</span> <span class="code-object" style="color: #910091">boolean</span> equals(<span class="code-object" style="color: #910091">Object</span> obj) {
<span class="code-keyword" style="color: #000091">if</span> (obj == <span class="code-keyword" style="color: #000091">null</span>) {
<span class="code-keyword" style="color: #000091">return</span> <span class="code-keyword" style="color: #000091">false</span>;
}
<span class="code-keyword" style="color: #000091">if</span> (getClass() != obj.getClass()) {
<span class="code-keyword" style="color: #000091">return</span> <span class="code-keyword" style="color: #000091">false</span>;
}
<span class="code-keyword" style="color: #000091">final</span> CompositeKeyModelId other = (CompositeKeyModelId)obj;
<span class="code-keyword" style="color: #000091">if</span> (<span class="code-keyword" style="color: #000091">this</span>.id1 != other.id1 && (<span class="code-keyword" style="color: #000091">this</span>.id1 == <span class="code-keyword" style="color: #000091">null</span> || !<span class="code-keyword" style="color: #000091">this</span>.id1.equals(other.id1))) {
<span class="code-keyword" style="color: #000091">return</span> <span class="code-keyword" style="color: #000091">false</span>;
}
<span class="code-keyword" style="color: #000091">return</span> <span class="code-keyword" style="color: #000091">this</span>.id2 == other.id2 || (<span class="code-keyword" style="color: #000091">this</span>.id2 != <span class="code-keyword" style="color: #000091">null</span> && <span class="code-keyword" style="color: #000091">this</span>.id2.equals(other.id2));
}
@Override
<span class="code-keyword" style="color: #000091">public</span> <span class="code-object" style="color: #910091">String</span> toString() {
<span class="code-keyword" style="color: #000091">return</span> <span class="code-quote" style="color: #009100">"CompositeKeyModelId{"</span> + <span class="code-quote" style="color: #009100">"id1="</span> + id1 + <span class="code-quote" style="color: #009100">", id2="</span> + id2 + '}';
}
<span class="code-comment" style="color: #808080">// Fields
</span> <span class="code-keyword" style="color: #000091">private</span> <span class="code-object" style="color: #910091">Integer</span> id1;
<span class="code-keyword" style="color: #000091">private</span> <span class="code-object" style="color: #910091">Integer</span> id2;
}
</pre>
</div>
</div>
<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="codeHeader panelHeader" style="border-bottom-width: 1px;; border-bottom: 1px solid #ccc; padding: 9px 12px">
<b>PrimaryCompositeKeyOption1Model.java</b>
</div>
<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">
@Entity
@HibernateDefaultEntity
@Table(name = <span class="code-quote" style="color: #009100">"PrimaryCompositeKey"</span>)
@Proxy(lazy = <span class="code-keyword" style="color: #000091">false</span>)
<span class="code-keyword" style="color: #000091">public</span> class PrimaryCompositeKeyOption1Model <span class="code-keyword" style="color: #000091">implements</span> Serializable {
@EmbeddedId
<span class="code-keyword" style="color: #000091">public</span> PrimaryCompositeKeyOption1ModelId getId() {
<span class="code-keyword" style="color: #000091">return</span> id;
}
<span class="code-keyword" style="color: #000091">public</span> void setId(PrimaryCompositeKeyOption1ModelId id) {
<span class="code-keyword" style="color: #000091">this</span>.id = id;
}
@Column(name = <span class="code-quote" style="color: #009100">"description"</span>)
<span class="code-keyword" style="color: #000091">public</span> <span class="code-object" style="color: #910091">String</span> getDescription() {
<span class="code-keyword" style="color: #000091">return</span> description;
}
<span class="code-keyword" style="color: #000091">public</span> void setDescription(<span class="code-object" style="color: #910091">String</span> description) {
<span class="code-keyword" style="color: #000091">this</span>.description = description;
}
@MapsId(value = <span class="code-quote" style="color: #009100">"primaryId"</span>)
@JoinColumn(name = <span class="code-quote" style="color: #009100">"primaryId"</span>)
@ManyToOne(fetch = FetchType.LAZY)
<span class="code-keyword" style="color: #000091">public</span> PrimaryKeyModel getPrimaryKeyModel() {
<span class="code-keyword" style="color: #000091">return</span> primaryKeyModel;
}
<span class="code-keyword" style="color: #000091">public</span> void setPrimaryKeyModel(PrimaryKeyModel primaryKeyModel) {
<span class="code-keyword" style="color: #000091">this</span>.primaryKeyModel = primaryKeyModel;
}
@MapsId(<span class="code-quote" style="color: #009100">"compositeKeyModelId"</span>)
@JoinColumns({
@JoinColumn(name = <span class="code-quote" style="color: #009100">"compositeId1"</span>, referencedColumnName = <span class="code-quote" style="color: #009100">"id1"</span>),
@JoinColumn(name = <span class="code-quote" style="color: #009100">"compositeId2"</span>, referencedColumnName = <span class="code-quote" style="color: #009100">"id2"</span>)
})
@ManyToOne(fetch = FetchType.LAZY)
<span class="code-keyword" style="color: #000091">public</span> CompositeKeyModel getCompositeKeyModel() {
<span class="code-keyword" style="color: #000091">return</span> compositeKeyModel;
}
<span class="code-keyword" style="color: #000091">public</span> void setCompositeKeyModel(CompositeKeyModel compositeKeyModel) {
<span class="code-keyword" style="color: #000091">this</span>.compositeKeyModel = compositeKeyModel;
}
@Override
<span class="code-keyword" style="color: #000091">public</span> <span class="code-object" style="color: #910091">String</span> toString() {
<span class="code-keyword" style="color: #000091">return</span> <span class="code-quote" style="color: #009100">"PrimaryCompositeKeyOption1Model{"</span> + <span class="code-quote" style="color: #009100">"id="</span> + id + <span class="code-quote" style="color: #009100">", description="</span> + description + '}';
}
<span class="code-comment" style="color: #808080">// Fields
</span> <span class="code-keyword" style="color: #000091">private</span> PrimaryCompositeKeyOption1ModelId id = <span class="code-keyword" style="color: #000091">new</span> PrimaryCompositeKeyOption1ModelId();
<span class="code-keyword" style="color: #000091">private</span> PrimaryKeyModel primaryKeyModel;
<span class="code-keyword" style="color: #000091">private</span> CompositeKeyModel compositeKeyModel;
<span class="code-keyword" style="color: #000091">private</span> <span class="code-object" style="color: #910091">String</span> description;
}
</pre>
</div>
</div>
<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="codeHeader panelHeader" style="border-bottom-width: 1px;; border-bottom: 1px solid #ccc; padding: 9px 12px">
<b>PrimaryCompositeKeyOption1ModelId.java</b>
</div>
<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">
@Embeddable
<span class="code-keyword" style="color: #000091">public</span> class PrimaryCompositeKeyOption1ModelId <span class="code-keyword" style="color: #000091">implements</span> Serializable {
<span class="code-keyword" style="color: #000091">public</span> PrimaryCompositeKeyOption1ModelId() {
}
<span class="code-keyword" style="color: #000091">public</span> PrimaryCompositeKeyOption1ModelId(<span class="code-object" style="color: #910091">Integer</span> primaryId, <span class="code-object" style="color: #910091">Integer</span> compositeId1, <span class="code-object" style="color: #910091">Integer</span> compositeId2) {
<span class="code-keyword" style="color: #000091">this</span>.primaryId = primaryId;
<span class="code-keyword" style="color: #000091">this</span>.compositeKeyModelId = <span class="code-keyword" style="color: #000091">new</span> CompositeKeyModelId(compositeId1, compositeId2);
}
@Column(name = <span class="code-quote" style="color: #009100">"primaryId"</span>)
<span class="code-keyword" style="color: #000091">public</span> <span class="code-object" style="color: #910091">Integer</span> getPrimaryId() {
<span class="code-keyword" style="color: #000091">return</span> primaryId;
}
<span class="code-keyword" style="color: #000091">public</span> void setPrimaryId(<span class="code-object" style="color: #910091">Integer</span> primaryId) {
<span class="code-keyword" style="color: #000091">this</span>.primaryId = primaryId;
}
<span class="code-keyword" style="color: #000091">public</span> CompositeKeyModelId getCompositeKeyModelId() {
<span class="code-keyword" style="color: #000091">return</span> compositeKeyModelId;
}
<span class="code-keyword" style="color: #000091">public</span> void setCompositeKeyModelId(CompositeKeyModelId compositeKeyModelId) {
<span class="code-keyword" style="color: #000091">this</span>.compositeKeyModelId = compositeKeyModelId;
}
@Override
<span class="code-keyword" style="color: #000091">public</span> <span class="code-object" style="color: #910091">int</span> hashCode() {
<span class="code-object" style="color: #910091">int</span> hash = 3;
hash = 37 * hash + (<span class="code-keyword" style="color: #000091">this</span>.primaryId != <span class="code-keyword" style="color: #000091">null</span> ? <span class="code-keyword" style="color: #000091">this</span>.primaryId.hashCode() : 0);
hash = 37 * hash + (<span class="code-keyword" style="color: #000091">this</span>.compositeKeyModelId != <span class="code-keyword" style="color: #000091">null</span> ? <span class="code-keyword" style="color: #000091">this</span>.compositeKeyModelId.hashCode() : 0);
<span class="code-keyword" style="color: #000091">return</span> hash;
}
@Override
<span class="code-keyword" style="color: #000091">public</span> <span class="code-object" style="color: #910091">boolean</span> equals(<span class="code-object" style="color: #910091">Object</span> obj) {
<span class="code-keyword" style="color: #000091">if</span> (obj == <span class="code-keyword" style="color: #000091">null</span>) {
<span class="code-keyword" style="color: #000091">return</span> <span class="code-keyword" style="color: #000091">false</span>;
}
<span class="code-keyword" style="color: #000091">if</span> (getClass() != obj.getClass()) {
<span class="code-keyword" style="color: #000091">return</span> <span class="code-keyword" style="color: #000091">false</span>;
}
<span class="code-keyword" style="color: #000091">final</span> PrimaryCompositeKeyOption1ModelId other = (PrimaryCompositeKeyOption1ModelId)obj;
<span class="code-keyword" style="color: #000091">if</span> (<span class="code-keyword" style="color: #000091">this</span>.primaryId != other.primaryId && (<span class="code-keyword" style="color: #000091">this</span>.primaryId == <span class="code-keyword" style="color: #000091">null</span> || !<span class="code-keyword" style="color: #000091">this</span>.primaryId.equals(other.primaryId))) {
<span class="code-keyword" style="color: #000091">return</span> <span class="code-keyword" style="color: #000091">false</span>;
}
<span class="code-keyword" style="color: #000091">return</span> <span class="code-keyword" style="color: #000091">this</span>.compositeKeyModelId == other.compositeKeyModelId || (<span class="code-keyword" style="color: #000091">this</span>.compositeKeyModelId != <span class="code-keyword" style="color: #000091">null</span> && <span class="code-keyword" style="color: #000091">this</span>.compositeKeyModelId.equals(other.compositeKeyModelId));
}
@Override
<span class="code-keyword" style="color: #000091">public</span> <span class="code-object" style="color: #910091">String</span> toString() {
<span class="code-keyword" style="color: #000091">return</span> <span class="code-quote" style="color: #009100">"PrimaryCompositeKeyOption1ModelId{"</span> + <span class="code-quote" style="color: #009100">"primaryId="</span> + primaryId + <span class="code-quote" style="color: #009100">", compositeKeyModelId="</span> + compositeKeyModelId + '}';
}
<span class="code-comment" style="color: #808080">// Fields
</span> <span class="code-keyword" style="color: #000091">private</span> <span class="code-object" style="color: #910091">Integer</span> primaryId;
<span class="code-keyword" style="color: #000091">private</span> CompositeKeyModelId compositeKeyModelId = <span class="code-keyword" style="color: #000091">new</span> CompositeKeyModelId();
}
</pre>
</div>
</div>
<p style="margin-top:0;margin-bottom:10px;; margin: 10px 0 0 0">Now, when I use the following test:</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">
<span class="code-comment" style="color: #808080">// Get the session factory
</span>GenericApplicationContext context = <span class="code-keyword" style="color: #000091">new</span> GenericXmlApplicationContext(<span class="code-quote" style="color: #009100">"com/geowareinc/shared/spring/test.context.xml"</span>);
SessionFactory sessionFactory = (SessionFactory)context.getBean(<span class="code-quote" style="color: #009100">"sessionFactory"</span>);
<span class="code-comment" style="color: #808080">// Load all the models
</span>Session session = sessionFactory.getCurrentSession();
Transaction transaction = session.beginTransaction();
List<PrimaryCompositeKeyOption1Model> models = session.createCriteria(PrimaryCompositeKeyOption1Model.class).list();
transaction.commit();
<span class="code-comment" style="color: #808080">// Dump models
</span><span class="code-keyword" style="color: #000091">for</span> (PrimaryCompositeKeyOption1Model model : models) {
<span class="code-object" style="color: #910091">System</span>.out.println(model);
<span class="code-object" style="color: #910091">System</span>.out.println(model.getPrimaryKeyModel());
<span class="code-object" style="color: #910091">System</span>.out.println(model.getCompositeKeyModel());
<span class="code-object" style="color: #910091">System</span>.out.println();
}
</pre>
</div>
</div>
<p style="margin-top:0;margin-bottom:10px;; margin: 10px 0 0 0">My output looks like:</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="codeHeader panelHeader" style="border-bottom-width: 1px;; border-bottom: 1px solid #ccc; padding: 9px 12px">
<b>Option 1 output,</b>
</div>
<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">
PrimaryCompositeKeyOption1Model{id=PrimaryCompositeKeyOption1ModelId{primaryId=0, compositeKeyModelId=CompositeKeyModelId{id1=0, id2=0}}, description=PCK0}
PrimaryKeyModel{id=0, description=PK0}
CompositeKeyModel{id=CompositeKeyModelId{id1=0, id2=0}, description=CK0}
PrimaryCompositeKeyOption1Model{id=PrimaryCompositeKeyOption1ModelId{primaryId=0, compositeKeyModelId=CompositeKeyModelId{id1=0, id2=0}}, description=PCK0}
PrimaryKeyModel{id=0, description=PK0}
CompositeKeyModel{id=CompositeKeyModelId{id1=0, id2=0}, description=CK0}
PrimaryCompositeKeyOption1Model{id=PrimaryCompositeKeyOption1ModelId{primaryId=0, compositeKeyModelId=CompositeKeyModelId{id1=1, id2=1}}, description=PCK2}
PrimaryKeyModel{id=0, description=PK0}
CompositeKeyModel{id=CompositeKeyModelId{id1=1, id2=0}, description=CK2}
PrimaryCompositeKeyOption1Model{id=PrimaryCompositeKeyOption1ModelId{primaryId=0, compositeKeyModelId=CompositeKeyModelId{id1=1, id2=1}}, description=PCK2}
PrimaryKeyModel{id=0, description=PK0}
CompositeKeyModel{id=CompositeKeyModelId{id1=1, id2=0}, description=CK2}
PrimaryCompositeKeyOption1Model{id=PrimaryCompositeKeyOption1ModelId{primaryId=0, compositeKeyModelId=CompositeKeyModelId{id1=2, id2=2}}, description=PCK4}
PrimaryKeyModel{id=0, description=PK0}
CompositeKeyModel{id=CompositeKeyModelId{id1=2, id2=0}, description=CK4}
PrimaryCompositeKeyOption1Model{id=PrimaryCompositeKeyOption1ModelId{primaryId=0, compositeKeyModelId=CompositeKeyModelId{id1=2, id2=2}}, description=PCK4}
PrimaryKeyModel{id=0, description=PK0}
CompositeKeyModel{id=CompositeKeyModelId{id1=2, id2=0}, description=CK4}
</pre>
</div>
</div>
<p style="margin-top:0;margin-bottom:10px;; margin: 10px 0 0 0">The CompositeKeyModelId referenced by the PrimaryCompositeKeyModelId does not contain the same data as the CompositeKeyModelId referenced by the CompositeKeyModel association. Additionally, the descriptions for both the PrimaryCompositeKeyModel and CompositeKeyModel is the same as the previous model every other model (i.e. no PCK1/CK1, PCK3/CK3, or PCK5/CK5). Bizarre.</p>
<p style="margin-top:0;margin-bottom:10px;; margin: 10px 0 0 0">I checked the query being generated, and it is selecting compositeId1 twice:</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-sql" style="margin: 10px 0 0 0; max-height: 30em; overflow: auto; white-space: pre-wrap; word-wrap: normal">
<span class="code-keyword" style="color: #000091">select</span> this_.compositeId1 as composit0_2_0_, this_.primaryId as primaryI1_2_0_, this_.compositeId1 as composit3_2_0_, this_.compositeId2 as composit4_2_0_, this_.description as descript2_2_0_
<span class="code-keyword" style="color: #000091">from</span> PrimaryCompositeKey this_
</pre>
</div>
</div>
<p style="margin-top:0;margin-bottom:10px;; margin: 10px 0 0 0">Other than the extra column, the data it returns is correct:</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">
composit0_2_0_        primaryI1_2_0_        composit3_2_0_        composit4_2_0_        descript2_2_0_
0                0                0                0                PCK0
0                0                0                1                PCK1
1                0                1                0                PCK2
1                0                1                1                PCK3
2                0                2                0                PCK4
2                0                2                1                PCK5
</pre>
</div>
</div>
<p style="margin-top:0;margin-bottom:10px;; margin: 10px 0 0 0">This does not happen with Option 2:</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="codeHeader panelHeader" style="border-bottom-width: 1px;; border-bottom: 1px solid #ccc; padding: 9px 12px">
<b>PrimaryCompositeKeyOption2Model.java</b>
</div>
<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">
@Entity
@HibernateDefaultEntity
@Table(name = <span class="code-quote" style="color: #009100">"PrimaryCompositeKey"</span>)
@Proxy(lazy = <span class="code-keyword" style="color: #000091">false</span>)
<span class="code-keyword" style="color: #000091">public</span> class PrimaryCompositeKeyOption2Model <span class="code-keyword" style="color: #000091">implements</span> Serializable {
@EmbeddedId
<span class="code-keyword" style="color: #000091">public</span> PrimaryCompositeKeyOption2ModelId getId() {
<span class="code-keyword" style="color: #000091">return</span> id;
}
<span class="code-keyword" style="color: #000091">public</span> void setId(PrimaryCompositeKeyOption2ModelId id) {
<span class="code-keyword" style="color: #000091">this</span>.id = id;
}
@Column(name = <span class="code-quote" style="color: #009100">"description"</span>)
<span class="code-keyword" style="color: #000091">public</span> <span class="code-object" style="color: #910091">String</span> getDescription() {
<span class="code-keyword" style="color: #000091">return</span> description;
}
<span class="code-keyword" style="color: #000091">public</span> void setDescription(<span class="code-object" style="color: #910091">String</span> description) {
<span class="code-keyword" style="color: #000091">this</span>.description = description;
}
@Override
<span class="code-keyword" style="color: #000091">public</span> <span class="code-object" style="color: #910091">String</span> toString() {
<span class="code-keyword" style="color: #000091">return</span> <span class="code-quote" style="color: #009100">"PrimaryCompositeKeyOption2Model{"</span> + <span class="code-quote" style="color: #009100">"description="</span> + description + '}';
}
<span class="code-comment" style="color: #808080">// Fields
</span> <span class="code-keyword" style="color: #000091">private</span> PrimaryCompositeKeyOption2ModelId id;
<span class="code-keyword" style="color: #000091">private</span> <span class="code-object" style="color: #910091">String</span> description;
}
</pre>
</div>
</div>
<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="codeHeader panelHeader" style="border-bottom-width: 1px;; border-bottom: 1px solid #ccc; padding: 9px 12px">
<b>PrimaryCompositeKeyOption2ModlId.java</b>
</div>
<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">
@Embeddable
<span class="code-keyword" style="color: #000091">public</span> class PrimaryCompositeKeyOption2ModelId <span class="code-keyword" style="color: #000091">implements</span> Serializable {
<span class="code-keyword" style="color: #000091">public</span> PrimaryCompositeKeyOption2ModelId() {
}
<span class="code-keyword" style="color: #000091">public</span> PrimaryCompositeKeyOption2ModelId(PrimaryKeyModel primayKeyModel, CompositeKeyModel compositeKeyModel) {
<span class="code-keyword" style="color: #000091">this</span>.primayKeyModel = primayKeyModel;
<span class="code-keyword" style="color: #000091">this</span>.compositeKeyModel = compositeKeyModel;
}
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = <span class="code-quote" style="color: #009100">"primaryId"</span>)
<span class="code-keyword" style="color: #000091">public</span> PrimaryKeyModel getPrimayKeyModel() {
<span class="code-keyword" style="color: #000091">return</span> primayKeyModel;
}
<span class="code-keyword" style="color: #000091">public</span> void setPrimayKeyModel(PrimaryKeyModel primayKeyModel) {
<span class="code-keyword" style="color: #000091">this</span>.primayKeyModel = primayKeyModel;
}
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumns({
@JoinColumn(name = <span class="code-quote" style="color: #009100">"compositeId1"</span>),
@JoinColumn(name = <span class="code-quote" style="color: #009100">"compositeId2"</span>)
})
<span class="code-keyword" style="color: #000091">public</span> CompositeKeyModel getCompositeKeyModel() {
<span class="code-keyword" style="color: #000091">return</span> compositeKeyModel;
}
<span class="code-keyword" style="color: #000091">public</span> void setCompositeKeyModel(CompositeKeyModel compositeKeyModel) {
<span class="code-keyword" style="color: #000091">this</span>.compositeKeyModel = compositeKeyModel;
}
@Override
<span class="code-keyword" style="color: #000091">public</span> <span class="code-object" style="color: #910091">int</span> hashCode() {
<span class="code-object" style="color: #910091">int</span> hash = 7;
hash = 97 * hash + (<span class="code-keyword" style="color: #000091">this</span>.primayKeyModel != <span class="code-keyword" style="color: #000091">null</span> ? <span class="code-keyword" style="color: #000091">this</span>.primayKeyModel.hashCode() : 0);
hash = 97 * hash + (<span class="code-keyword" style="color: #000091">this</span>.compositeKeyModel != <span class="code-keyword" style="color: #000091">null</span> ? <span class="code-keyword" style="color: #000091">this</span>.compositeKeyModel.hashCode() : 0);
<span class="code-keyword" style="color: #000091">return</span> hash;
}
@Override
<span class="code-keyword" style="color: #000091">public</span> <span class="code-object" style="color: #910091">boolean</span> equals(<span class="code-object" style="color: #910091">Object</span> obj) {
<span class="code-keyword" style="color: #000091">if</span> (obj == <span class="code-keyword" style="color: #000091">null</span>) {
<span class="code-keyword" style="color: #000091">return</span> <span class="code-keyword" style="color: #000091">false</span>;
}
<span class="code-keyword" style="color: #000091">if</span> (getClass() != obj.getClass()) {
<span class="code-keyword" style="color: #000091">return</span> <span class="code-keyword" style="color: #000091">false</span>;
}
<span class="code-keyword" style="color: #000091">final</span> PrimaryCompositeKeyOption2ModelId other = (PrimaryCompositeKeyOption2ModelId)obj;
<span class="code-keyword" style="color: #000091">if</span> (<span class="code-keyword" style="color: #000091">this</span>.primayKeyModel != other.primayKeyModel && (<span class="code-keyword" style="color: #000091">this</span>.primayKeyModel == <span class="code-keyword" style="color: #000091">null</span> || !<span class="code-keyword" style="color: #000091">this</span>.primayKeyModel.equals(other.primayKeyModel))) {
<span class="code-keyword" style="color: #000091">return</span> <span class="code-keyword" style="color: #000091">false</span>;
}
<span class="code-keyword" style="color: #000091">return</span> <span class="code-keyword" style="color: #000091">this</span>.compositeKeyModel == other.compositeKeyModel || (<span class="code-keyword" style="color: #000091">this</span>.compositeKeyModel != <span class="code-keyword" style="color: #000091">null</span> && <span class="code-keyword" style="color: #000091">this</span>.compositeKeyModel.equals(other.compositeKeyModel));
}
<span class="code-comment" style="color: #808080">// Fields
</span> <span class="code-keyword" style="color: #000091">private</span> PrimaryKeyModel primayKeyModel;
<span class="code-keyword" style="color: #000091">private</span> CompositeKeyModel compositeKeyModel;
}
</pre>
</div>
</div>
<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="codeHeader panelHeader" style="border-bottom-width: 1px;; border-bottom: 1px solid #ccc; padding: 9px 12px">
<b>Option 2 output</b>
</div>
<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">
PrimaryCompositeKeyOption2Model{description=PCK0}
PrimaryKeyModel{id=0, description=PK0}
CompositeKeyModel{id=CompositeKeyModelId{id1=0, id2=0}, description=CK0}
PrimaryCompositeKeyOption2Model{description=PCK1}
PrimaryKeyModel{id=0, description=PK0}
CompositeKeyModel{id=CompositeKeyModelId{id1=0, id2=1}, description=CK1}
PrimaryCompositeKeyOption2Model{description=PCK2}
PrimaryKeyModel{id=0, description=PK0}
CompositeKeyModel{id=CompositeKeyModelId{id1=1, id2=0}, description=CK2}
PrimaryCompositeKeyOption2Model{description=PCK3}
PrimaryKeyModel{id=0, description=PK0}
CompositeKeyModel{id=CompositeKeyModelId{id1=1, id2=1}, description=CK3}
PrimaryCompositeKeyOption2Model{description=PCK4}
PrimaryKeyModel{id=0, description=PK0}
CompositeKeyModel{id=CompositeKeyModelId{id1=2, id2=0}, description=CK4}
PrimaryCompositeKeyOption2Model{description=PCK5}
PrimaryKeyModel{id=0, description=PK0}
CompositeKeyModel{id=CompositeKeyModelId{id1=2, id2=1}, description=CK5}
</pre>
</div>
</div>
<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-sql" style="margin: 10px 0 0 0; max-height: 30em; overflow: auto; white-space: pre-wrap; word-wrap: normal">
<span class="code-keyword" style="color: #000091">select</span> this_.compositeId1 as composit3_2_0_, this_.compositeId2 as composit4_2_0_, this_.primaryId as primaryI1_2_0_, this_.description as descript2_2_0_
<span class="code-keyword" style="color: #000091">from</span> PrimaryCompositeKey this_
</pre>
</div>
</div>
<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">
composit3_2_0_        composit4_2_0_        primaryI1_2_0_        descript2_2_0_
0                0                0                PCK0
0                1                0                PCK1
1                0                0                PCK2
1                1                0                PCK3
2                0                0                PCK4
2                1                0                PCK5
</pre>
</div>
</div>
<p style="margin-top:0;margin-bottom:10px;; margin: 10px 0 0 0">As you can see, the extra column doesn't exist in this scenario, which leads me to believe it is the culprit.</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-9208#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-f5f23fab-6de2-46fd-a46d-b655ce86459b" 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-9208#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.3-OD-04-019#6322-<span title="5ba1e997140606d61a6d783a06f6ffadb05787c3" data-commit-id="5ba1e997140606d61a6d783a06f6ffadb05787c3}">sha1:5ba1e99</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-19d5e1c9-aa30-4643-b0c5-ae13259fabf5" alt="Atlassian logo" title="Atlassian logo" width="169" height="36" class="image_fix" />
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
</body>
</html>