Skip to content

Commit ca3b22a

Browse files
committed
HHH-8580 clearing a map collection caused NPE
1 parent 075bc86 commit ca3b22a

File tree

3 files changed

+85
-9
lines changed

3 files changed

+85
-9
lines changed

hibernate-core/src/main/java/org/hibernate/persister/collection/OneToManyPersister.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,7 @@ private void writeIndex(PersistentCollection collection, Iterator entries, Seria
208208
while ( entries.hasNext() ) {
209209

210210
final Object entry = entries.next();
211-
if ( collection.entryExists( entry, i ) ) {
211+
if ( entry != null && collection.entryExists( entry, i ) ) {
212212
int offset = 1;
213213
PreparedStatement st = null;
214214
boolean callable = isUpdateCallable();

hibernate-core/src/test/java/org/hibernate/test/annotations/onetomany/OrderByTest.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -364,6 +364,10 @@ public void testInverseIndex() {
364364
catch ( SQLException e ) {
365365
fail(e.getMessage());
366366
}
367+
finally {
368+
s.getTransaction().rollback();
369+
s.close();
370+
}
367371
}
368372

369373
@Test

hibernate-core/src/test/java/org/hibernate/test/collection/map/PersistentMapTest.java

Lines changed: 80 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,30 +22,49 @@
2222
* Boston, MA 02110-1301 USA
2323
*/
2424
package org.hibernate.test.collection.map;
25-
import java.util.HashMap;
26-
27-
import org.junit.Test;
28-
29-
import org.hibernate.Session;
30-
import org.hibernate.collection.internal.PersistentMap;
31-
import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase;
32-
3325
import static org.junit.Assert.assertEquals;
3426
import static org.junit.Assert.assertFalse;
3527
import static org.junit.Assert.assertNotNull;
3628
import static org.junit.Assert.assertNull;
3729
import static org.junit.Assert.assertTrue;
3830

31+
import java.io.Serializable;
32+
import java.util.HashMap;
33+
import java.util.Map;
34+
35+
import javax.persistence.CascadeType;
36+
import javax.persistence.Entity;
37+
import javax.persistence.FetchType;
38+
import javax.persistence.GeneratedValue;
39+
import javax.persistence.Id;
40+
import javax.persistence.JoinColumn;
41+
import javax.persistence.ManyToOne;
42+
import javax.persistence.MapKeyColumn;
43+
import javax.persistence.OneToMany;
44+
45+
import org.hibernate.Query;
46+
import org.hibernate.Session;
47+
import org.hibernate.collection.internal.PersistentMap;
48+
import org.hibernate.testing.TestForIssue;
49+
import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase;
50+
import org.junit.Test;
51+
3952
/**
4053
* Test various situations using a {@link PersistentMap}.
4154
*
4255
* @author Steve Ebersole
56+
* @author Brett Meyer
4357
*/
4458
public class PersistentMapTest extends BaseCoreFunctionalTestCase {
4559
@Override
4660
public String[] getMappings() {
4761
return new String[] { "collection/map/Mappings.hbm.xml" };
4862
}
63+
64+
@Override
65+
protected Class<?>[] getAnnotatedClasses() {
66+
return new Class<?>[] { User.class, UserData.class };
67+
}
4968

5069
@Test
5170
@SuppressWarnings({ "unchecked" })
@@ -157,4 +176,57 @@ public void testRemoveAgainstUninitializedMap() {
157176
session.getTransaction().commit();
158177
session.close();
159178
}
179+
180+
@Test
181+
@TestForIssue(jiraKey = "HHH-5732")
182+
public void testClearMap() {
183+
Session s = openSession();
184+
s.beginTransaction();
185+
186+
User user = new User();
187+
UserData userData = new UserData();
188+
userData.user = user;
189+
user.userDatas.put( "foo", userData );
190+
s.persist( user );
191+
192+
s.getTransaction().commit();
193+
s.clear();
194+
195+
s.beginTransaction();
196+
197+
user = (User) s.get( User.class, 1 );
198+
user.userDatas.clear();
199+
s.update( user );
200+
Query q = s.createQuery( "DELETE FROM " + UserData.class.getName() + " d WHERE d.user = :user" );
201+
q.setParameter( "user", user );
202+
q.executeUpdate();
203+
204+
s.getTransaction().commit();
205+
s.clear();
206+
207+
assertEquals( ( (User) s.get( User.class, user.id ) ).userDatas.size(), 0 );
208+
assertEquals( s.createQuery( "FROM " + UserData.class.getName() ).list().size(), 0 );
209+
210+
s.close();
211+
}
212+
213+
@Entity
214+
private static class User implements Serializable {
215+
@Id @GeneratedValue
216+
private Integer id;
217+
218+
@OneToMany(fetch = FetchType.LAZY, mappedBy = "user", cascade = CascadeType.ALL)
219+
@MapKeyColumn(name = "name", nullable = true)
220+
private Map<String, UserData> userDatas = new HashMap<String, UserData>();
221+
}
222+
223+
@Entity
224+
private static class UserData {
225+
@Id @GeneratedValue
226+
private Integer id;
227+
228+
@ManyToOne
229+
@JoinColumn(name = "userId")
230+
private User user;
231+
}
160232
}

0 commit comments

Comments
 (0)