Skip to content

Commit

Permalink
ListArrayType on Set entity attribute fails for EntityManager.merge o…
Browse files Browse the repository at this point in the history
…peration #717
  • Loading branch information
aleksei-konahav authored and vladmihalcea committed Jun 4, 2024
1 parent 7372cd7 commit 60be483
Show file tree
Hide file tree
Showing 15 changed files with 222 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;

/**
* <code>ArrayUtil</code> - Array utilities holder.
Expand Down Expand Up @@ -374,4 +376,17 @@ public static <T> List<T> asList(T[] array) {
}
return list;
}

/**
* @param array array to transform
* @param <T> array element type
* @return the {@link Set} representation of the array
*/
public static <T> Set<T> asSet(T[] array) {
Set<T> set = new LinkedHashSet<T>(array.length);
for (int i = 0; i < array.length; i++) {
set.add(array[i]);
}
return set;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,10 @@ public ListArrayTypeDescriptor() {
super(Object.class, new MutableMutabilityPlan<Object>() {
@Override
protected Object deepCopyNotNull(Object value) {
if (value instanceof Collection) {
if (value instanceof Set) {
Object[] array = ((Set<Object>) value).toArray();
return ArrayUtil.asSet(ArrayUtil.deepCopy(array));
} else if (value instanceof Collection) {
Object[] array = ((Collection<Object>) value).toArray();
return ArrayUtil.asList(ArrayUtil.deepCopy(array));
} else if (value.getClass().isArray()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -266,6 +266,30 @@ public void test() {

assertEquals(2, events.size());
});

Event _event = doInJPA(entityManager -> {
return entityManager.find(Event.class, 1L);
});

String newString = "New";
LocalDateTime newTimestamp = LocalDateTime.of(2024, 6, 4, 11, 22, 33);

assertEquals(2, _event.getSensorNames().size());
assertEquals(2, _event.getLocalDateTimeSetValues().size());
_event.getSensorNames().add(newString);
_event.getLocalDateTimeSetValues().add(newTimestamp);

doInJPA(entityManager -> {
entityManager.merge(_event);
});

doInJPA(entityManager -> {
Event event = entityManager.find(Event.class, 1L);
assertEquals(3, event.getSensorNames().size());
assertTrue(event.getSensorNames().contains(newString));
assertEquals(3, event.getLocalDateTimeSetValues().size());
assertTrue(event.getLocalDateTimeSetValues().contains(newTimestamp));
});
}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;

/**
* <code>ArrayUtil</code> - Array utilities holder.
Expand Down Expand Up @@ -374,4 +376,17 @@ public static <T> List<T> asList(T[] array) {
}
return list;
}

/**
* @param array array to transform
* @param <T> array element type
* @return the {@link Set} representation of the array
*/
public static <T> Set<T> asSet(T[] array) {
Set<T> set = new LinkedHashSet<T>(array.length);
for (int i = 0; i < array.length; i++) {
set.add(array[i]);
}
return set;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,10 @@ public ListArrayTypeDescriptor() {
super(Object.class, new MutableMutabilityPlan<Object>() {
@Override
protected Object deepCopyNotNull(Object value) {
if (value instanceof Collection) {
if (value instanceof Set) {
Object[] array = ((Set<Object>) value).toArray();
return ArrayUtil.asSet(ArrayUtil.deepCopy(array));
} else if (value instanceof Collection) {
Object[] array = ((Collection<Object>) value).toArray();
return ArrayUtil.asList(ArrayUtil.deepCopy(array));
} else if (value.getClass().isArray()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -266,6 +266,30 @@ public void test() {

assertEquals(2, events.size());
});

Event _event = doInJPA(entityManager -> {
return entityManager.find(Event.class, 1L);
});

String newString = "New";
LocalDateTime newTimestamp = LocalDateTime.of(2024, 6, 4, 11, 22, 33);

assertEquals(2, _event.getSensorNames().size());
assertEquals(2, _event.getLocalDateTimeSetValues().size());
_event.getSensorNames().add(newString);
_event.getLocalDateTimeSetValues().add(newTimestamp);

doInJPA(entityManager -> {
entityManager.merge(_event);
});

doInJPA(entityManager -> {
Event event = entityManager.find(Event.class, 1L);
assertEquals(3, event.getSensorNames().size());
assertTrue(event.getSensorNames().contains(newString));
assertEquals(3, event.getLocalDateTimeSetValues().size());
assertTrue(event.getLocalDateTimeSetValues().contains(newTimestamp));
});
}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;

/**
* <code>ArrayUtil</code> - Array utilities holder.
Expand Down Expand Up @@ -374,4 +376,17 @@ public static <T> List<T> asList(T[] array) {
}
return list;
}

/**
* @param array array to transform
* @param <T> array element type
* @return the {@link Set} representation of the array
*/
public static <T> Set<T> asSet(T[] array) {
Set<T> set = new LinkedHashSet<T>(array.length);
for (int i = 0; i < array.length; i++) {
set.add(array[i]);
}
return set;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,13 @@ public ListArrayTypeDescriptor() {
super(Collection.class, new MutableMutabilityPlan<>() {
@Override
protected Collection deepCopyNotNull(Collection value) {
if (value instanceof Set) {
Object[] array = ((Set<Object>) value).toArray();
return ArrayUtil.asSet(ArrayUtil.deepCopy(array));
} else {
Object[] array = ((Collection<Object>) value).toArray();
return ArrayUtil.asList(ArrayUtil.deepCopy(array));
}
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -261,6 +261,30 @@ public void test() {

assertEquals(2, events.size());
});

Event _event = doInJPA(entityManager -> {
return entityManager.find(Event.class, 1L);
});

String newString = "New";
LocalDateTime newTimestamp = LocalDateTime.of(2024, 6, 4, 11, 22, 33);

assertEquals(2, _event.getSensorNames().size());
assertEquals(2, _event.getLocalDateTimeSetValues().size());
_event.getSensorNames().add(newString);
_event.getLocalDateTimeSetValues().add(newTimestamp);

doInJPA(entityManager -> {
entityManager.merge(_event);
});

doInJPA(entityManager -> {
Event event = entityManager.find(Event.class, 1L);
assertEquals(3, event.getSensorNames().size());
assertTrue(event.getSensorNames().contains(newString));
assertEquals(3, event.getLocalDateTimeSetValues().size());
assertTrue(event.getLocalDateTimeSetValues().contains(newTimestamp));
});
}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;

/**
* <code>ArrayUtil</code> - Array utilities holder.
Expand Down Expand Up @@ -374,4 +376,17 @@ public static <T> List<T> asList(T[] array) {
}
return list;
}

/**
* @param array array to transform
* @param <T> array element type
* @return the {@link Set} representation of the array
*/
public static <T> Set<T> asSet(T[] array) {
Set<T> set = new LinkedHashSet<T>(array.length);
for (int i = 0; i < array.length; i++) {
set.add(array[i]);
}
return set;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,13 @@ public ListArrayTypeDescriptor() {
super(Collection.class, new MutableMutabilityPlan<>() {
@Override
protected Collection deepCopyNotNull(Collection value) {
Object[] array = ((Collection<Object>) value).toArray();
return ArrayUtil.asList(ArrayUtil.deepCopy(array));
if (value instanceof Set) {
Object[] array = ((Set<Object>) value).toArray();
return ArrayUtil.asSet(ArrayUtil.deepCopy(array));
} else {
Object[] array = ((Collection<Object>) value).toArray();
return ArrayUtil.asList(ArrayUtil.deepCopy(array));
}
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -261,6 +261,30 @@ public void test() {

assertEquals(2, events.size());
});

Event _event = doInJPA(entityManager -> {
return entityManager.find(Event.class, 1L);
});

String newString = "New";
LocalDateTime newTimestamp = LocalDateTime.of(2024, 6, 4, 11, 22, 33);

assertEquals(2, _event.getSensorNames().size());
assertEquals(2, _event.getLocalDateTimeSetValues().size());
_event.getSensorNames().add(newString);
_event.getLocalDateTimeSetValues().add(newTimestamp);

doInJPA(entityManager -> {
entityManager.merge(_event);
});

doInJPA(entityManager -> {
Event event = entityManager.find(Event.class, 1L);
assertEquals(3, event.getSensorNames().size());
assertTrue(event.getSensorNames().contains(newString));
assertEquals(3, event.getLocalDateTimeSetValues().size());
assertTrue(event.getLocalDateTimeSetValues().contains(newTimestamp));
});
}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;

/**
* <code>ArrayUtil</code> - Array utilities holder.
Expand Down Expand Up @@ -374,4 +376,17 @@ public static <T> List<T> asList(T[] array) {
}
return list;
}

/**
* @param array array to transform
* @param <T> array element type
* @return the {@link Set} representation of the array
*/
public static <T> Set<T> asSet(T[] array) {
Set<T> set = new LinkedHashSet<T>(array.length);
for (int i = 0; i < array.length; i++) {
set.add(array[i]);
}
return set;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,13 @@ public ListArrayTypeDescriptor() {
super(Collection.class, new MutableMutabilityPlan<>() {
@Override
protected Collection deepCopyNotNull(Collection value) {
Object[] array = ((Collection<Object>) value).toArray();
return ArrayUtil.asList(ArrayUtil.deepCopy(array));
if (value instanceof Set) {
Object[] array = ((Set<Object>) value).toArray();
return ArrayUtil.asSet(ArrayUtil.deepCopy(array));
} else {
Object[] array = ((Collection<Object>) value).toArray();
return ArrayUtil.asList(ArrayUtil.deepCopy(array));
}
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -261,6 +261,30 @@ public void test() {

assertEquals(2, events.size());
});

Event _event = doInJPA(entityManager -> {
return entityManager.find(Event.class, 1L);
});

String newString = "New";
LocalDateTime newTimestamp = LocalDateTime.of(2024, 6, 4, 11, 22, 33);

assertEquals(2, _event.getSensorNames().size());
assertEquals(2, _event.getLocalDateTimeSetValues().size());
_event.getSensorNames().add(newString);
_event.getLocalDateTimeSetValues().add(newTimestamp);

doInJPA(entityManager -> {
entityManager.merge(_event);
});

doInJPA(entityManager -> {
Event event = entityManager.find(Event.class, 1L);
assertEquals(3, event.getSensorNames().size());
assertTrue(event.getSensorNames().contains(newString));
assertEquals(3, event.getLocalDateTimeSetValues().size());
assertTrue(event.getLocalDateTimeSetValues().contains(newTimestamp));
});
}

@Test
Expand Down

0 comments on commit 60be483

Please sign in to comment.