Skip to content

Commit 1b0fb16

Browse files
committed
Use byte arrays when cloning JSON objects #198
Add tests to check the number of statements generated when persisting and fetching JSON Types
1 parent 6dae8ac commit 1b0fb16

16 files changed

Lines changed: 450 additions & 170 deletions

hibernate-types-52/src/test/java/com/vladmihalcea/hibernate/type/json/EhcacheMySQLJsonBinaryTypeTest.java

Lines changed: 24 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,14 @@
77
import com.vladmihalcea.hibernate.type.model.Ticket;
88
import com.vladmihalcea.hibernate.type.util.AbstractMySQLIntegrationTest;
99
import com.vladmihalcea.hibernate.type.util.transaction.JPATransactionFunction;
10+
import net.ttddyy.dsproxy.QueryCount;
11+
import net.ttddyy.dsproxy.QueryCountHolder;
1012
import org.hibernate.annotations.CacheConcurrencyStrategy;
1113
import org.hibernate.annotations.Type;
1214
import org.junit.Test;
1315

1416
import javax.persistence.*;
17+
import java.util.Arrays;
1518
import java.util.List;
1619
import java.util.Properties;
1720
import java.util.concurrent.atomic.AtomicReference;
@@ -44,11 +47,11 @@ protected void additionalProperties(Properties properties) {
4447
properties.setProperty("hibernate.cache.region.factory_class", "ehcache");
4548
}
4649

47-
@Test
48-
public void test() {
49-
final AtomicReference<Event> eventHolder = new AtomicReference<>();
50+
private Event _event;
5051

51-
doInJPA((JPATransactionFunction<Void>) entityManager -> {
52+
@Override
53+
protected void afterInit() {
54+
doInJPA(entityManager -> {
5255
Event nullEvent = new Event();
5356
nullEvent.setId(0L);
5457
entityManager.persist(nullEvent);
@@ -63,11 +66,11 @@ public void test() {
6366
event.setProperties(
6467
JacksonUtil.toJsonNode(
6568
"{" +
66-
" \"title\": \"High-Performance Java Persistence\"," +
67-
" \"author\": \"Vlad Mihalcea\"," +
68-
" \"publisher\": \"Amazon\"," +
69-
" \"price\": 44.99" +
70-
"}"
69+
" \"title\": \"High-Performance Java Persistence\"," +
70+
" \"author\": \"Vlad Mihalcea\"," +
71+
" \"publisher\": \"Amazon\"," +
72+
" \"price\": 44.99" +
73+
"}"
7174
)
7275
);
7376
entityManager.persist(event);
@@ -76,14 +79,21 @@ public void test() {
7679
ticket.setPrice(12.34d);
7780
ticket.setRegistrationCode("ABC123");
7881

79-
eventHolder.set(event);
80-
81-
return null;
82+
_event = event;
8283
});
83-
doInJPA((JPATransactionFunction<Void>) entityManager -> {
84-
Event event = entityManager.find(Event.class, eventHolder.get().getId());
84+
}
85+
86+
@Test
87+
public void test() {
88+
doInJPA(entityManager -> {
89+
QueryCountHolder.clear();
90+
91+
Event event = entityManager.find(Event.class, _event.getId());
8592
assertNotNull(event.getProperties());
8693

94+
QueryCount queryCount = QueryCountHolder.getGrandTotal();
95+
assertEquals(0, queryCount.getTotal());
96+
8797
List<String> properties = entityManager.createNativeQuery(
8898
"select CAST(e.properties AS CHAR(1000)) " +
8999
"from event e " +
@@ -93,8 +103,6 @@ public void test() {
93103
assertEquals(1, properties.size());
94104
JsonNode jsonNode = JacksonUtil.toJsonNode(properties.get(0));
95105
assertEquals("High-Performance Java Persistence", jsonNode.get("title").asText());
96-
97-
return null;
98106
});
99107
}
100108

hibernate-types-52/src/test/java/com/vladmihalcea/hibernate/type/json/MySQLGenericJsonTypeTest.java

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
import com.vladmihalcea.hibernate.type.model.Location;
55
import com.vladmihalcea.hibernate.type.model.Ticket;
66
import com.vladmihalcea.hibernate.type.util.AbstractMySQLIntegrationTest;
7+
import net.ttddyy.dsproxy.QueryCount;
8+
import net.ttddyy.dsproxy.QueryCountHolder;
79
import org.hibernate.annotations.Type;
810
import org.junit.Test;
911

@@ -37,10 +39,10 @@ protected String[] packages() {
3739
};
3840
}
3941

40-
@Test
41-
public void test() {
42-
final AtomicReference<Event> eventHolder = new AtomicReference<>();
42+
private Event _event;
4343

44+
@Override
45+
protected void afterInit() {
4446
doInJPA(entityManager -> {
4547
Location location = new Location();
4648
location.setCountry("Romania");
@@ -51,14 +53,25 @@ public void test() {
5153
event.setAlternativeLocations(Arrays.asList(location));
5254
entityManager.persist(event);
5355

54-
eventHolder.set(event);
56+
_event = event;
5557
});
58+
}
59+
60+
@Test
61+
public void test() {
62+
QueryCountHolder.clear();
63+
5664
doInJPA(entityManager -> {
57-
Event event = entityManager.find(Event.class, eventHolder.get().getId());
65+
Event event = entityManager.find(Event.class, _event.getId());
5866
assertEquals(1, event.getAlternativeLocations().size());
5967
assertEquals("Cluj-Napoca", event.getAlternativeLocations().get(0).getCity());
6068
assertEquals("Romania", event.getAlternativeLocations().get(0).getCountry());
6169
});
70+
71+
QueryCount queryCount = QueryCountHolder.getGrandTotal();
72+
assertEquals(1, queryCount.getTotal());
73+
assertEquals(1, queryCount.getSelect());
74+
assertEquals(0, queryCount.getUpdate());
6275
}
6376

6477
@Entity(name = "Event")

hibernate-types-52/src/test/java/com/vladmihalcea/hibernate/type/json/MySQLJsonTypeSetTest.java

Lines changed: 38 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
import com.vladmihalcea.hibernate.type.model.BaseEntity;
44
import com.vladmihalcea.hibernate.type.util.AbstractMySQLIntegrationTest;
5+
import net.ttddyy.dsproxy.QueryCount;
6+
import net.ttddyy.dsproxy.QueryCountHolder;
57
import org.hibernate.annotations.DynamicUpdate;
68
import org.hibernate.annotations.Type;
79
import org.junit.Test;
@@ -32,10 +34,10 @@ protected Class<?>[] entities() {
3234
};
3335
}
3436

35-
@Test
36-
public void test() {
37-
final AtomicReference<User> userHolder = new AtomicReference<>();
37+
private User _user;
3838

39+
@Override
40+
protected void afterInit() {
3941
doInJPA(entityManager -> {
4042
User user = new User();
4143

@@ -48,22 +50,17 @@ public void test() {
4850
)));
4951

5052
entityManager.persist(user);
51-
userHolder.set(user);
53+
_user = user;
5254
});
55+
}
5356

57+
@Test
58+
public void test() {
5459
doInJPA(entityManager -> {
55-
User user = entityManager.find(User.class, userHolder.get().getId());
56-
assertEquals(new HashSet<>(asList("1234567", "7654321")), user.getPhones());
57-
assertEquals(EnumSet.of(Role.USER, Role.ADMIN), user.getRoles());
58-
assertEquals(new HashSet<>(asList(
59-
new Child("John", 1, new HashSet<>(asList("toy4", "toy3"))),
60-
new Child("Jane", 2, new HashSet<>(asList("toy2", "toy1")))
61-
)), user.getChildren());
62-
assertEquals(Integer.valueOf(0), user.getVersion());
63-
});
60+
User user = entityManager.find(User.class, _user.getId());
61+
62+
QueryCountHolder.clear();
6463

65-
doInJPA(entityManager -> {
66-
User user = entityManager.find(User.class, userHolder.get().getId());
6764
user.setPhones(new HashSet<>(asList("1592637", "9518473")));
6865
user.setRoles(EnumSet.of(Role.USER, Role.DEV));
6966
user.setChildren(new HashSet<>(asList(
@@ -72,8 +69,12 @@ public void test() {
7269
)));
7370
});
7471

72+
QueryCount queryCount = QueryCountHolder.getGrandTotal();
73+
assertEquals(1, queryCount.getTotal());
74+
assertEquals(1, queryCount.getUpdate());
75+
7576
doInJPA(entityManager -> {
76-
User user = entityManager.find(User.class, userHolder.get().getId());
77+
User user = entityManager.find(User.class, _user.getId());
7778
assertEquals(new HashSet<>(asList("9518473", "1592637")), user.getPhones());
7879
assertEquals(EnumSet.of(Role.DEV, Role.USER), user.getRoles());
7980
assertEquals(new HashSet<>(asList(
@@ -84,6 +85,27 @@ public void test() {
8485
});
8586
}
8687

88+
@Test
89+
public void testLoad() {
90+
QueryCountHolder.clear();
91+
92+
doInJPA(entityManager -> {
93+
User user = entityManager.find(User.class, _user.getId());
94+
assertEquals(new HashSet<>(asList("1234567", "7654321")), user.getPhones());
95+
assertEquals(EnumSet.of(Role.USER, Role.ADMIN), user.getRoles());
96+
assertEquals(new HashSet<>(asList(
97+
new Child("John", 1, new HashSet<>(asList("toy4", "toy3"))),
98+
new Child("Jane", 2, new HashSet<>(asList("toy2", "toy1")))
99+
)), user.getChildren());
100+
assertEquals(Integer.valueOf(0), user.getVersion());
101+
});
102+
103+
QueryCount queryCount = QueryCountHolder.getGrandTotal();
104+
assertEquals(1, queryCount.getTotal());
105+
assertEquals(1, queryCount.getSelect());
106+
assertEquals(0, queryCount.getUpdate());
107+
}
108+
87109
@Entity
88110
@Table(name = "users")
89111
@DynamicUpdate

hibernate-types-52/src/test/java/com/vladmihalcea/hibernate/type/json/MySQLJsonTypeTest.java

Lines changed: 40 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
import com.vladmihalcea.hibernate.type.model.Location;
55
import com.vladmihalcea.hibernate.type.model.Ticket;
66
import com.vladmihalcea.hibernate.type.util.AbstractMySQLIntegrationTest;
7+
import net.ttddyy.dsproxy.QueryCount;
8+
import net.ttddyy.dsproxy.QueryCountHolder;
79
import org.hibernate.annotations.Type;
810
import org.junit.Test;
911

@@ -24,22 +26,24 @@ public class MySQLJsonTypeTest extends AbstractMySQLIntegrationTest {
2426
@Override
2527
protected Class<?>[] entities() {
2628
return new Class<?>[]{
27-
Event.class,
28-
Participant.class
29+
Event.class,
30+
Participant.class
2931
};
3032
}
3133

3234
@Override
3335
protected String[] packages() {
3436
return new String[]{
35-
Location.class.getPackage().getName()
37+
Location.class.getPackage().getName()
3638
};
3739
}
3840

39-
@Test
40-
public void test() {
41-
final AtomicReference<Event> eventHolder = new AtomicReference<>();
42-
final AtomicReference<Participant> participantHolder = new AtomicReference<>();
41+
private Event _event;
42+
43+
private Participant _participant;
44+
45+
@Override
46+
protected void afterInit() {
4347

4448
doInJPA(entityManager -> {
4549
Event nullEvent = new Event();
@@ -66,21 +70,42 @@ public void test() {
6670

6771
entityManager.persist(participant);
6872

69-
eventHolder.set(event);
70-
participantHolder.set(participant);
73+
_event = event;
74+
_participant = participant;
7175
});
76+
}
77+
78+
@Test
79+
public void testLoad() {
80+
QueryCountHolder.clear();
81+
82+
doInJPA(entityManager -> {
83+
Event event = entityManager.find(Event.class, _event.getId());
84+
assertEquals("Romania", event.getLocation().getCountry());
85+
assertEquals("Cluj-Napoca", event.getLocation().getCity());
86+
});
87+
88+
QueryCount queryCount = QueryCountHolder.getGrandTotal();
89+
assertEquals(1, queryCount.getTotal());
90+
assertEquals(1, queryCount.getSelect());
91+
assertEquals(0, queryCount.getUpdate());
92+
}
93+
94+
@Test
95+
public void test() {
96+
7297
doInJPA(entityManager -> {
73-
Event event = entityManager.find(Event.class, eventHolder.get().getId());
98+
Event event = entityManager.find(Event.class, _event.getId());
7499
assertEquals("Cluj-Napoca", event.getLocation().getCity());
75100

76-
Participant participant = entityManager.find(Participant.class, participantHolder.get().getId());
101+
Participant participant = entityManager.find(Participant.class, _participant.getId());
77102
assertEquals("ABC123", participant.getTicket().getRegistrationCode());
78103

79104
List<String> participants = entityManager.createNativeQuery(
80-
"select p.ticket -> \"$.registrationCode\" " +
81-
"from participant p " +
82-
"where JSON_EXTRACT(p.ticket, \"$.price\") > 1 ")
83-
.getResultList();
105+
"select p.ticket -> \"$.registrationCode\" " +
106+
"from participant p " +
107+
"where JSON_EXTRACT(p.ticket, \"$.price\") > 1 ")
108+
.getResultList();
84109

85110
event.getLocation().setCity("Constanța");
86111
entityManager.flush();

hibernate-types-52/src/test/java/com/vladmihalcea/hibernate/type/json/MySQLParametrizedJsonTypeTest.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,14 @@ public class MySQLParametrizedJsonTypeTest extends AbstractMySQLIntegrationTest
2121
@Override
2222
protected Class<?>[] entities() {
2323
return new Class<?>[]{
24-
PropertyHolder.class,
24+
PropertyHolder.class,
2525
};
2626
}
2727

2828
@Override
2929
protected String[] packages() {
3030
return new String[]{
31-
PropertyHolder.class.getPackage().getName()
31+
PropertyHolder.class.getPackage().getName()
3232
};
3333
}
3434

@@ -58,6 +58,7 @@ public void test() {
5858

5959
eventHolder.set(propertyHolder);
6060
});
61+
6162
doInJPA(entityManager -> {
6263
PropertyHolder propertyHolder = entityManager.find(PropertyHolder.class, eventHolder.get().getId());
6364
assertEquals("value", propertyHolder.getProperty("key1"));

0 commit comments

Comments
 (0)