<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?avatarId=10162" 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="dmitry.bedrin" id="email_dmitry.bedrin" href="https://hibernate.onjira.com/secure/ViewProfile.jspa?name=dmitry.bedrin" style="color:#6c797f;">Dmitry Bedrin</a>
commented on <img src="https://hibernate.onjira.com/images/icons/bug.gif" height="16" width="16" border="0" align="absmiddle" alt="Bug"> <a style='color:#6c797f;text-decoration:none;' href='https://hibernate.onjira.com/browse/HHH-3441'>HHH-3441</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-3441'><strong>Null pointer exception on org.hibernate.type.AbstractType.getHashCode(AbstractType.java:112)</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 colspan="2" style="color:#000000;font-family:Arial,FreeSans,Helvetica,sans-serif;font-size:12px;padding:0 0 16px 0;width:100%;">
<div class="comment-block" style="background-color:#edf5ff;border:1px solid #dddddd;color:#000000;padding:12px;"><p>I'm experiencing the same issue with Hibernate 3.3.1.GA (Part of JBoss 5.1.0.GA):</p>
<div class="code panel" style="border-width: 1px;"><div class="codeHeader panelHeader" style="border-bottom-width: 1px;"><b>Project.java</b></div><div class="codeContent panelContent">
<pre class="code-java"><span class="code-keyword">package</span> com.tnf.db.ass.mtm;
<span class="code-keyword">import</span> javax.persistence.*;
<span class="code-keyword">import</span> java.util.HashSet;
<span class="code-keyword">import</span> java.util.Set;
@Entity
@Table(name = <span class="code-quote">"PROJECT"</span>)
<span class="code-keyword">public</span> class Project {
@Id
@SequenceGenerator(name = <span class="code-quote">"projectIdSeqGenerator"</span>, sequenceName = <span class="code-quote">"SEQ_PROJECT"</span>)
@GeneratedValue(generator = <span class="code-quote">"projectIdSeqGenerator"</span>, strategy = GenerationType.SEQUENCE)
@Column(name = <span class="code-quote">"ID"</span>, nullable = <span class="code-keyword">false</span>, length = 20, precision = 0)
<span class="code-keyword">private</span> <span class="code-object">Long</span> id;
@Column(name = <span class="code-quote">"NAME"</span>, length = 255)
<span class="code-keyword">private</span> <span class="code-object">String</span> name;
@OneToMany(mappedBy=<span class="code-quote">"project"</span>, cascade = CascadeType.ALL)
@org.hibernate.annotations.Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
<span class="code-keyword">private</span> Set<ProjectXPerson> persons;
<span class="code-keyword">public</span> void addPerson(Person person, <span class="code-object">String</span> role) {
ProjectXPerson projectXPerson = <span class="code-keyword">new</span> ProjectXPerson();
projectXPerson.setPerson(person);
projectXPerson.setProject(<span class="code-keyword">this</span>);
projectXPerson.setRole(role);
<span class="code-keyword">if</span> (<span class="code-keyword">null</span> == persons) persons = <span class="code-keyword">new</span> HashSet<ProjectXPerson>();
persons.add(projectXPerson);
<span class="code-keyword">if</span> (<span class="code-keyword">null</span> == person.getProjects()) person.setProjects(<span class="code-keyword">new</span> HashSet<ProjectXPerson>());
person.getProjects().add(projectXPerson);
}
<span class="code-keyword">public</span> void clearPersons() {
<span class="code-keyword">if</span> (<span class="code-keyword">null</span> == persons) <span class="code-keyword">return</span>;
<span class="code-keyword">for</span> (ProjectXPerson projectXPerson : persons) {
<span class="code-keyword">if</span> (<span class="code-keyword">null</span> == projectXPerson.getPerson().getProjects()) <span class="code-keyword">continue</span>;
projectXPerson.getPerson().getProjects().remove(projectXPerson);
}
persons.clear();
}
<span class="code-keyword">public</span> <span class="code-object">Long</span> getId() {
<span class="code-keyword">return</span> id;
}
<span class="code-keyword">public</span> void setId(<span class="code-object">Long</span> id) {
<span class="code-keyword">this</span>.id = id;
}
<span class="code-keyword">public</span> <span class="code-object">String</span> getName() {
<span class="code-keyword">return</span> name;
}
<span class="code-keyword">public</span> void setName(<span class="code-object">String</span> name) {
<span class="code-keyword">this</span>.name = name;
}
<span class="code-keyword">public</span> Set<ProjectXPerson> getPersons() {
<span class="code-keyword">return</span> persons;
}
<span class="code-keyword">public</span> void setPersons(Set<ProjectXPerson> persons) {
<span class="code-keyword">this</span>.persons = persons;
}
@Override
<span class="code-keyword">public</span> <span class="code-object">String</span> toString() {
<span class="code-keyword">return</span> <span class="code-quote">"Project{"</span> +
<span class="code-quote">"id="</span> + id +
<span class="code-quote">", name='"</span> + name + '\'' +
'}';
}
}</pre>
</div></div>
<div class="code panel" style="border-width: 1px;"><div class="codeHeader panelHeader" style="border-bottom-width: 1px;"><b>Person.java</b></div><div class="codeContent panelContent">
<pre class="code-java"><span class="code-keyword">package</span> com.tnf.db.ass.mtm;
<span class="code-keyword">import</span> javax.persistence.*;
<span class="code-keyword">import</span> java.util.Set;
@Entity
@Table(name = <span class="code-quote">"PERSON"</span>)
<span class="code-keyword">public</span> class Person {
@Id
@SequenceGenerator(name = <span class="code-quote">"personIdSeqGenerator"</span>, sequenceName = <span class="code-quote">"SEQ_PERSON"</span>)
@GeneratedValue(generator = <span class="code-quote">"personIdSeqGenerator"</span>, strategy = GenerationType.SEQUENCE)
@Column(name = <span class="code-quote">"ID"</span>, nullable = <span class="code-keyword">false</span>, length = 20, precision = 0)
<span class="code-keyword">private</span> <span class="code-object">Long</span> id;
@Column(name = <span class="code-quote">"NAME"</span>, length = 255)
<span class="code-keyword">private</span> <span class="code-object">String</span> name;
@OneToMany(mappedBy=<span class="code-quote">"person"</span>)
<span class="code-keyword">private</span> Set<ProjectXPerson> projects;
<span class="code-keyword">public</span> <span class="code-object">Long</span> getId() {
<span class="code-keyword">return</span> id;
}
<span class="code-keyword">public</span> void setId(<span class="code-object">Long</span> id) {
<span class="code-keyword">this</span>.id = id;
}
<span class="code-keyword">public</span> <span class="code-object">String</span> getName() {
<span class="code-keyword">return</span> name;
}
<span class="code-keyword">public</span> void setName(<span class="code-object">String</span> name) {
<span class="code-keyword">this</span>.name = name;
}
<span class="code-keyword">public</span> Set<ProjectXPerson> getProjects() {
<span class="code-keyword">return</span> projects;
}
<span class="code-keyword">public</span> void setProjects(Set<ProjectXPerson> projects) {
<span class="code-keyword">this</span>.projects = projects;
}
@Override
<span class="code-keyword">public</span> <span class="code-object">String</span> toString() {
<span class="code-keyword">return</span> <span class="code-quote">"Person{"</span> +
<span class="code-quote">"id="</span> + id +
<span class="code-quote">", name='"</span> + name + '\'' +
'}';
}
}</pre>
</div></div>
<div class="code panel" style="border-width: 1px;"><div class="codeHeader panelHeader" style="border-bottom-width: 1px;"><b>ProjectXPerson.java</b></div><div class="codeContent panelContent">
<pre class="code-java"><span class="code-keyword">package</span> com.tnf.db.ass.mtm;
<span class="code-keyword">import</span> javax.persistence.*;
<span class="code-keyword">import</span> java.io.Serializable;
@Entity
@Table(name=<span class="code-quote">"PROJECT_X_PERSON"</span>)
@IdClass(ProjectXPerson.PK.class)
<span class="code-keyword">public</span> class ProjectXPerson {
@Column(name = <span class="code-quote">"ROLE"</span>)
<span class="code-keyword">private</span> <span class="code-object">String</span> role;
@Id
<span class="code-keyword">private</span> Project project;
@Id
<span class="code-keyword">private</span> Person person;
<span class="code-keyword">public</span> <span class="code-keyword">static</span> class PK <span class="code-keyword">implements</span> Serializable {
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name=<span class="code-quote">"PROJECT_ID"</span>)
<span class="code-keyword">private</span> Project project;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name=<span class="code-quote">"PERSON_ID"</span>)
<span class="code-keyword">private</span> Person person;
@Override
<span class="code-keyword">public</span> <span class="code-object">boolean</span> equals(<span class="code-object">Object</span> o) {
<span class="code-keyword">if</span> (<span class="code-keyword">this</span> == o) <span class="code-keyword">return</span> <span class="code-keyword">true</span>;
<span class="code-keyword">if</span> (o == <span class="code-keyword">null</span> || getClass() != o.getClass()) <span class="code-keyword">return</span> <span class="code-keyword">false</span>;
PK pk = (PK) o;
<span class="code-keyword">if</span> (person != <span class="code-keyword">null</span> ? !person.equals(pk.person) : pk.person != <span class="code-keyword">null</span>) <span class="code-keyword">return</span> <span class="code-keyword">false</span>;
<span class="code-keyword">if</span> (project != <span class="code-keyword">null</span> ? !project.equals(pk.project) : pk.project != <span class="code-keyword">null</span>) <span class="code-keyword">return</span> <span class="code-keyword">false</span>;
<span class="code-keyword">return</span> <span class="code-keyword">true</span>;
}
@Override
<span class="code-keyword">public</span> <span class="code-object">int</span> hashCode() {
<span class="code-object">int</span> result = project != <span class="code-keyword">null</span> ? project.hashCode() : 0;
result = 31 * result + (person != <span class="code-keyword">null</span> ? person.hashCode() : 0);
<span class="code-keyword">return</span> result;
}
}
<span class="code-keyword">public</span> <span class="code-object">String</span> getRole() {
<span class="code-keyword">return</span> role;
}
<span class="code-keyword">public</span> void setRole(<span class="code-object">String</span> role) {
<span class="code-keyword">this</span>.role = role;
}
<span class="code-keyword">public</span> Project getProject() {
<span class="code-keyword">return</span> project;
}
<span class="code-keyword">public</span> void setProject(Project project) {
<span class="code-keyword">this</span>.project = project;
}
<span class="code-keyword">public</span> Person getPerson() {
<span class="code-keyword">return</span> person;
}
<span class="code-keyword">public</span> void setPerson(Person person) {
<span class="code-keyword">this</span>.person = person;
}
@Override
<span class="code-keyword">public</span> <span class="code-object">boolean</span> equals(<span class="code-object">Object</span> o) {
<span class="code-keyword">if</span> (<span class="code-keyword">this</span> == o) <span class="code-keyword">return</span> <span class="code-keyword">true</span>;
<span class="code-keyword">if</span> (o == <span class="code-keyword">null</span> || getClass() != o.getClass()) <span class="code-keyword">return</span> <span class="code-keyword">false</span>;
ProjectXPerson that = (ProjectXPerson) o;
<span class="code-keyword">if</span> (person != <span class="code-keyword">null</span> ? !person.equals(that.person) : that.person != <span class="code-keyword">null</span>) <span class="code-keyword">return</span> <span class="code-keyword">false</span>;
<span class="code-keyword">if</span> (project != <span class="code-keyword">null</span> ? !project.equals(that.project) : that.project != <span class="code-keyword">null</span>) <span class="code-keyword">return</span> <span class="code-keyword">false</span>;
<span class="code-keyword">return</span> <span class="code-keyword">true</span>;
}
@Override
<span class="code-keyword">public</span> <span class="code-object">int</span> hashCode() {
<span class="code-object">int</span> result = project != <span class="code-keyword">null</span> ? project.hashCode() : 0;
result = 31 * result + (person != <span class="code-keyword">null</span> ? person.hashCode() : 0);
<span class="code-keyword">return</span> result;
}
}</pre>
</div></div>
<p>My test case:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeHeader panelHeader" style="border-bottom-width: 1px;"><b>MTMTest.java</b></div><div class="codeContent panelContent">
<pre class="code-java"><span class="code-keyword">package</span> com.tnf.db.ass.mtm;
<span class="code-keyword">import</span> com.tnf.db.persistence.util.PersistenceUtil;
<span class="code-keyword">import</span> org.junit.Test;
<span class="code-keyword">import</span> org.junit.runner.RunWith;
<span class="code-keyword">import</span> org.springframework.test.context.ContextConfiguration;
<span class="code-keyword">import</span> org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
<span class="code-keyword">import</span> org.springframework.test.context.transaction.TransactionConfiguration;
<span class="code-keyword">import</span> org.springframework.transaction.annotation.Transactional;
<span class="code-keyword">import</span> javax.persistence.EntityManager;
<span class="code-keyword">import</span> javax.persistence.PersistenceContext;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { <span class="code-quote">"classpath:/beans-test.xml"</span> })
@TransactionConfiguration(transactionManager = <span class="code-quote">"transactionManager"</span>, defaultRollback = <span class="code-keyword">true</span>)
@Transactional
<span class="code-keyword">public</span> class MTMTest {
@PersistenceContext(unitName = PersistenceUtil.PERSISTENCE_UNIT_NAME)
<span class="code-keyword">protected</span> EntityManager em;
@Test
<span class="code-keyword">public</span> void create() <span class="code-keyword">throws</span> Exception {
Person joe = <span class="code-keyword">new</span> Person();
joe.setName(<span class="code-quote">"Joe"</span>);
<span class="code-comment">//em.persist(joe);
</span>
Person jane = <span class="code-keyword">new</span> Person();
jane.setName(<span class="code-quote">"Jane"</span>);
<span class="code-comment">//em.persist(jane);
</span>
Project manhattan = <span class="code-keyword">new</span> Project();
manhattan.setName(<span class="code-quote">"Manhattan"</span>);
em.persist(manhattan);
manhattan.addPerson(joe, <span class="code-quote">"Engineer"</span>);
manhattan.addPerson(jane, <span class="code-quote">"Engineer"</span>);
em.flush();
em.clear();
}
}</pre>
</div></div>
<p>This test case fails with following exception:</p>
<div class="preformatted panel" style="border-width: 1px;"><div class="preformattedContent panelContent">
<pre>java.lang.NullPointerException
        at org.hibernate.type.AbstractType.getHashCode(AbstractType.java:136)
        at org.hibernate.type.AbstractType.getHashCode(AbstractType.java:144)
        at org.hibernate.type.EntityType.getHashCode(EntityType.java:312)
        at org.hibernate.type.ComponentType.getHashCode(ComponentType.java:212)
        at org.hibernate.engine.EntityKey.generateHashCode(EntityKey.java:126)
        at org.hibernate.engine.EntityKey.<init>(EntityKey.java:70)
        at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:184)
        at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:144)
        at org.hibernate.ejb.event.EJB3PersistEventListener.saveWithGeneratedId(EJB3PersistEventListener.java:49)
        at org.hibernate.event.def.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:154)
        at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:110)
        at org.hibernate.impl.SessionImpl.firePersistOnFlush(SessionImpl.java:671)
        at org.hibernate.impl.SessionImpl.persistOnFlush(SessionImpl.java:663)
        at org.hibernate.engine.CascadingAction$9.cascade(CascadingAction.java:346)
        at org.hibernate.engine.Cascade.cascadeToOne(Cascade.java:291)
        at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:239)
        at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:192)
        at org.hibernate.engine.Cascade.cascadeCollectionElements(Cascade.java:319)
        at org.hibernate.engine.Cascade.cascadeCollection(Cascade.java:265)
        at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:242)
        at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:192)
        at org.hibernate.engine.Cascade.cascade(Cascade.java:153)
        at org.hibernate.event.def.AbstractFlushingEventListener.cascadeOnFlush(AbstractFlushingEventListener.java:154)
        at org.hibernate.event.def.AbstractFlushingEventListener.prepareEntityFlushes(AbstractFlushingEventListener.java:145)
        at org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:88)
        at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:49)
        at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1027)
        at org.hibernate.ejb.AbstractEntityManagerImpl.flush(AbstractEntityManagerImpl.java:304)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:240)
        at $Proxy63.flush(Unknown Source)
        at com.tnf.db.ass.mtm.MTMTest.create(MTMTest.java:43)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
        at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
        at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
        at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
        at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:74)
        at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:82)
        at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72)
        at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:240)
        at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
        at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
        at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
        at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
        at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
        at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
        at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
        at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
        at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
        at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:180)
        at org.junit.runner.JUnitCore.run(JUnitCore.java:157)
        at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:71)
        at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:202)
        at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:63)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
</pre>
</div></div>
<p>If I remove comments from em.persist(joe); and em.persist(jane); lines it works as expected</p></div>
<div style="color:#505050;padding:4px 0 0 0;"> </div>
</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 <a style='color:#6c797f;' href='https://hibernate.onjira.com/secure/ContactAdministrators!default.jspa'>JIRA administrators</a>.<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 -->