Skip to content

Commit 637e717

Browse files
authored
Merge pull request #1141 from davidcostanzo/lighthouse-2121-patch
[#2121] Move _key() after reference/null checks in JPABase.equals()
2 parents 0187399 + 5fc5cf6 commit 637e717

File tree

3 files changed

+57
-2
lines changed

3 files changed

+57
-2
lines changed

framework/src/play/db/jpa/JPABase.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -274,14 +274,14 @@ public boolean isPersistent() {
274274
*/
275275
@Override
276276
public boolean equals(Object other) {
277-
Object key = this._key();
278-
279277
if (other == null) {
280278
return false;
281279
}
282280
if (this == other) {
283281
return true;
284282
}
283+
284+
Object key = this._key();
285285
if (key == null) {
286286
return false;
287287
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package models;
2+
3+
import javax.persistence.Entity;
4+
import javax.persistence.Id;
5+
import javax.persistence.IdClass;
6+
import javax.persistence.JoinColumn;
7+
import javax.persistence.ManyToOne;
8+
9+
import play.db.jpa.GenericModel;
10+
11+
@Entity
12+
public class ArrayIdEntity extends GenericModel {
13+
@Id
14+
public String[] id = new String[2];
15+
16+
public ArrayIdEntity(String id1, String id2) {
17+
id[0] = id1;
18+
id[1] = id2;
19+
}
20+
}

samples-and-tests/just-test-cases/test/SimpleJPATest.java

+35
Original file line numberDiff line numberDiff line change
@@ -179,5 +179,40 @@ public void verifyCountWithCompositeKey() {
179179

180180
}
181181

182+
/**
183+
* Simple tests for {@link play.db.jpa.JPABase#equals()}.
184+
*/
185+
@Test
186+
public void testEquals() {
187+
List<User> users = User.findAll();
188+
User userA = users.get(0);
189+
User userB = users.get(1);
190+
191+
// Simple tests
192+
assertFalse(userA.equals(null)); // null
193+
assertTrue(userA.equals(userA)); // ref equals
194+
assertFalse(userA.equals(userB)); // different objects
195+
196+
// tests with objects that don't have a key set
197+
User unsaved1 = new User("Unsaved user #1");
198+
User unsaved2 = new User("Unsaved user #2");
199+
assertTrue(unsaved1.equals(unsaved1)); // ref equals (always true)
200+
assertFalse(unsaved1.equals(unsaved2)); // non-ref+no key
201+
assertFalse(unsaved1.equals(userA));
202+
assertFalse(userA.equals(unsaved1));
203+
204+
// Test completely incompatible objects
205+
assertFalse(userA.equals("This is a string, not a model object."));
206+
207+
// Test with array IDs
208+
ArrayIdEntity a1 = new ArrayIdEntity("1", "2");
209+
ArrayIdEntity a2 = new ArrayIdEntity("1", "2");
210+
ArrayIdEntity b1 = new ArrayIdEntity("1", "X");
211+
212+
assertTrue(a1.equals(a2)); // array key equals
213+
assertFalse(a1.equals(b1)); // array key with one element difference
214+
assertFalse(userA.equals(a1)); // compare scalar key to array key
215+
assertFalse(a1.equals(userA)); // compare array key with scalar key
216+
}
182217
}
183218

0 commit comments

Comments
 (0)