HHH-9954 - Equality checking should consider arrays
This commit is contained in:
parent
dee80ab566
commit
ca1c2efaf9
|
@ -329,7 +329,10 @@ public final class ArrayHelper {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Compare 2 arrays only at the first level
|
* Compare 2 arrays only at the first level
|
||||||
|
*
|
||||||
|
* @deprecated Use {@link java.util.Arrays#equals(Object[], Object[])} instead
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
public static boolean isEquals(Object[] o1, Object[] o2) {
|
public static boolean isEquals(Object[] o1, Object[] o2) {
|
||||||
if ( o1 == o2 ) {
|
if ( o1 == o2 ) {
|
||||||
return true;
|
return true;
|
||||||
|
@ -351,7 +354,10 @@ public final class ArrayHelper {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Compare 2 arrays only at the first level
|
* Compare 2 arrays only at the first level
|
||||||
|
*
|
||||||
|
* @deprecated Use {@link java.util.Arrays#equals(char[], char[])} instead
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
public static boolean isEquals(char[] o1, char[] o2) {
|
public static boolean isEquals(char[] o1, char[] o2) {
|
||||||
if ( o1 == o2 ) {
|
if ( o1 == o2 ) {
|
||||||
return true;
|
return true;
|
||||||
|
@ -373,7 +379,10 @@ public final class ArrayHelper {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Compare 2 arrays only at the first level
|
* Compare 2 arrays only at the first level
|
||||||
|
*
|
||||||
|
* @deprecated Use {@link java.util.Arrays#equals(byte[], byte[])} instead
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
public static boolean isEquals(byte[] b1, byte[] b2) {
|
public static boolean isEquals(byte[] b1, byte[] b2) {
|
||||||
if ( b1 == b2 ) {
|
if ( b1 == b2 ) {
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -6,16 +6,96 @@
|
||||||
*/
|
*/
|
||||||
package org.hibernate.internal.util.compare;
|
package org.hibernate.internal.util.compare;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* Helper for equality determination
|
||||||
|
*
|
||||||
* @author Gavin King
|
* @author Gavin King
|
||||||
|
* @author Steve Ebersole
|
||||||
*/
|
*/
|
||||||
public final class EqualsHelper {
|
public final class EqualsHelper {
|
||||||
|
|
||||||
|
@SuppressWarnings("SimplifiableIfStatement")
|
||||||
public static boolean equals(final Object x, final Object y) {
|
public static boolean equals(final Object x, final Object y) {
|
||||||
return x == y || ( x != null && y != null && x.equals( y ) );
|
if ( x == y ) {
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private EqualsHelper() {}
|
if ( x == null || y == null ) {
|
||||||
|
// One is null, but the other is not (otherwise the `x == y` check would have passed).
|
||||||
|
// null can never equal a non-null
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return x.equals( y );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Like the legacy {@link #equals} method, but handles array-specific checks
|
||||||
|
*
|
||||||
|
* @param x One value to check
|
||||||
|
* @param y The other value
|
||||||
|
*
|
||||||
|
* @return {@code true} if the 2 values are equal; {@code false} otherwise.
|
||||||
|
*/
|
||||||
|
public static boolean areEqual(final Object x, final Object y) {
|
||||||
|
if ( x == y ) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( x == null || y == null ) {
|
||||||
|
// One is null, but the other is not (otherwise the `x == y` check would have passed).
|
||||||
|
// null can never equal a non-null
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( x.equals( y ) ) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check for possibility of arrays
|
||||||
|
final Class xClass = x.getClass();
|
||||||
|
final Class yClass = y.getClass();
|
||||||
|
|
||||||
|
if ( xClass.isArray() && yClass.isArray() ) {
|
||||||
|
if ( xClass.equals( yClass ) ) {
|
||||||
|
if ( x instanceof boolean[] ) {
|
||||||
|
return Arrays.equals( (boolean[]) x, (boolean[]) y );
|
||||||
|
}
|
||||||
|
else if ( x instanceof byte[] ) {
|
||||||
|
return Arrays.equals( (byte[]) x, (byte[]) y );
|
||||||
|
}
|
||||||
|
else if ( x instanceof char[] ) {
|
||||||
|
return Arrays.equals( (char[]) x, (char[]) y );
|
||||||
|
}
|
||||||
|
else if ( x instanceof short[] ) {
|
||||||
|
return Arrays.equals( (short[]) x, (short[]) y );
|
||||||
|
}
|
||||||
|
else if ( x instanceof int[] ) {
|
||||||
|
return Arrays.equals( (int[]) x, (int[]) y );
|
||||||
|
}
|
||||||
|
else if ( x instanceof long[] ) {
|
||||||
|
return Arrays.equals( (long[]) x, (long[]) y );
|
||||||
|
}
|
||||||
|
else if ( x instanceof double[] ) {
|
||||||
|
return Arrays.equals( (double[]) x, (double[]) y );
|
||||||
|
}
|
||||||
|
else if ( x instanceof float[] ) {
|
||||||
|
return Arrays.equals( (float[]) x, (float[]) y );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return Arrays.equals( (Object[]) x, (Object[]) y );
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Private ctor - disallow instantiation
|
||||||
|
*/
|
||||||
|
private EqualsHelper() {
|
||||||
|
// disallow instantiation
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,18 +6,19 @@
|
||||||
*/
|
*/
|
||||||
package org.hibernate.test.annotations.lob;
|
package org.hibernate.test.annotations.lob;
|
||||||
|
|
||||||
import junit.framework.AssertionFailedError;
|
import java.util.Arrays;
|
||||||
import org.junit.Assert;
|
|
||||||
import org.junit.Test;
|
|
||||||
|
|
||||||
import org.hibernate.Session;
|
import org.hibernate.Session;
|
||||||
import org.hibernate.dialect.SQLServerDialect;
|
import org.hibernate.dialect.SQLServerDialect;
|
||||||
import org.hibernate.dialect.Sybase11Dialect;
|
import org.hibernate.dialect.Sybase11Dialect;
|
||||||
import org.hibernate.dialect.SybaseASE15Dialect;
|
import org.hibernate.dialect.SybaseASE15Dialect;
|
||||||
import org.hibernate.dialect.SybaseDialect;
|
import org.hibernate.dialect.SybaseDialect;
|
||||||
import org.hibernate.internal.util.collections.ArrayHelper;
|
|
||||||
import org.hibernate.testing.RequiresDialect;
|
import org.hibernate.testing.RequiresDialect;
|
||||||
import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase;
|
import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase;
|
||||||
|
import org.junit.Assert;
|
||||||
|
import org.junit.Test;
|
||||||
|
import junit.framework.AssertionFailedError;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tests eager materialization and mutation of data mapped by
|
* Tests eager materialization and mutation of data mapped by
|
||||||
|
@ -130,7 +131,7 @@ public class ImageTest extends BaseCoreFunctionalTestCase {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void assertEquals(byte[] val1, byte[] val2) {
|
public static void assertEquals(byte[] val1, byte[] val2) {
|
||||||
if (!ArrayHelper.isEquals( val1, val2 )) {
|
if ( !Arrays.equals( val1, val2 ) ) {
|
||||||
throw new AssertionFailedError("byte arrays did not match");
|
throw new AssertionFailedError("byte arrays did not match");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,18 +6,19 @@
|
||||||
*/
|
*/
|
||||||
package org.hibernate.test.annotations.lob;
|
package org.hibernate.test.annotations.lob;
|
||||||
|
|
||||||
import junit.framework.AssertionFailedError;
|
import java.util.Arrays;
|
||||||
import org.junit.Assert;
|
|
||||||
import org.junit.Test;
|
|
||||||
|
|
||||||
import org.hibernate.Session;
|
import org.hibernate.Session;
|
||||||
import org.hibernate.dialect.SQLServerDialect;
|
import org.hibernate.dialect.SQLServerDialect;
|
||||||
import org.hibernate.dialect.Sybase11Dialect;
|
import org.hibernate.dialect.Sybase11Dialect;
|
||||||
import org.hibernate.dialect.SybaseASE15Dialect;
|
import org.hibernate.dialect.SybaseASE15Dialect;
|
||||||
import org.hibernate.dialect.SybaseDialect;
|
import org.hibernate.dialect.SybaseDialect;
|
||||||
import org.hibernate.internal.util.collections.ArrayHelper;
|
|
||||||
import org.hibernate.testing.RequiresDialect;
|
import org.hibernate.testing.RequiresDialect;
|
||||||
import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase;
|
import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase;
|
||||||
|
import org.junit.Assert;
|
||||||
|
import org.junit.Test;
|
||||||
|
import junit.framework.AssertionFailedError;
|
||||||
|
|
||||||
import static org.junit.Assert.assertNull;
|
import static org.junit.Assert.assertNull;
|
||||||
|
|
||||||
|
@ -110,7 +111,7 @@ public class TextTest extends BaseCoreFunctionalTestCase {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void assertEquals(char[] val1, char[] val2) {
|
public static void assertEquals(char[] val1, char[] val2) {
|
||||||
if (!ArrayHelper.isEquals( val1, val2 )) {
|
if ( !Arrays.equals( val1, val2 ) ) {
|
||||||
throw new AssertionFailedError("byte arrays did not match");
|
throw new AssertionFailedError("byte arrays did not match");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,12 +7,12 @@
|
||||||
package org.hibernate.test.lob;
|
package org.hibernate.test.lob;
|
||||||
|
|
||||||
import java.sql.Blob;
|
import java.sql.Blob;
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
import org.hibernate.Hibernate;
|
import org.hibernate.Hibernate;
|
||||||
import org.hibernate.LockOptions;
|
import org.hibernate.LockOptions;
|
||||||
import org.hibernate.Session;
|
import org.hibernate.Session;
|
||||||
import org.hibernate.dialect.TeradataDialect;
|
import org.hibernate.dialect.TeradataDialect;
|
||||||
import org.hibernate.internal.util.collections.ArrayHelper;
|
|
||||||
|
|
||||||
import org.hibernate.testing.DialectChecks;
|
import org.hibernate.testing.DialectChecks;
|
||||||
import org.hibernate.testing.RequiresDialectFeature;
|
import org.hibernate.testing.RequiresDialectFeature;
|
||||||
|
@ -180,7 +180,7 @@ public class BlobLocatorTest extends BaseCoreFunctionalTestCase {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void assertEquals(byte[] val1, byte[] val2) {
|
public static void assertEquals(byte[] val1, byte[] val2) {
|
||||||
if ( !ArrayHelper.isEquals( val1, val2 ) ) {
|
if ( !Arrays.equals( val1, val2 ) ) {
|
||||||
throw new AssertionFailedError( "byte arrays did not match" );
|
throw new AssertionFailedError( "byte arrays did not match" );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,14 +6,15 @@
|
||||||
*/
|
*/
|
||||||
package org.hibernate.test.lob;
|
package org.hibernate.test.lob;
|
||||||
|
|
||||||
import org.junit.Test;
|
import java.util.Arrays;
|
||||||
|
|
||||||
import org.hibernate.Session;
|
import org.hibernate.Session;
|
||||||
import org.hibernate.internal.util.collections.ArrayHelper;
|
|
||||||
import org.hibernate.testing.DialectChecks;
|
import org.hibernate.testing.DialectChecks;
|
||||||
import org.hibernate.testing.RequiresDialectFeature;
|
import org.hibernate.testing.RequiresDialectFeature;
|
||||||
import org.hibernate.testing.TestForIssue;
|
import org.hibernate.testing.TestForIssue;
|
||||||
import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase;
|
import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
import static org.junit.Assert.assertTrue;
|
import static org.junit.Assert.assertTrue;
|
||||||
|
@ -58,7 +59,7 @@ public class LobMergeTest extends BaseCoreFunctionalTestCase {
|
||||||
assertEquals( "blob sizes did not match after merge", LOB_SIZE, entity.getBlobLocator().length() );
|
assertEquals( "blob sizes did not match after merge", LOB_SIZE, entity.getBlobLocator().length() );
|
||||||
assertTrue(
|
assertTrue(
|
||||||
"blob contents did not match after merge",
|
"blob contents did not match after merge",
|
||||||
ArrayHelper.isEquals( updated, BlobLocatorTest.extractData( entity.getBlobLocator() ) )
|
Arrays.equals( updated, BlobLocatorTest.extractData( entity.getBlobLocator() ) )
|
||||||
);
|
);
|
||||||
s.delete( entity );
|
s.delete( entity );
|
||||||
s.getTransaction().commit();
|
s.getTransaction().commit();
|
||||||
|
|
|
@ -6,13 +6,14 @@
|
||||||
*/
|
*/
|
||||||
package org.hibernate.test.lob;
|
package org.hibernate.test.lob;
|
||||||
|
|
||||||
import junit.framework.AssertionFailedError;
|
import java.util.Arrays;
|
||||||
import org.junit.Assert;
|
|
||||||
import org.junit.Test;
|
|
||||||
|
|
||||||
import org.hibernate.Session;
|
import org.hibernate.Session;
|
||||||
import org.hibernate.internal.util.collections.ArrayHelper;
|
|
||||||
import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase;
|
import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase;
|
||||||
|
import org.junit.Assert;
|
||||||
|
import org.junit.Test;
|
||||||
|
import junit.framework.AssertionFailedError;
|
||||||
|
|
||||||
import static org.junit.Assert.assertNull;
|
import static org.junit.Assert.assertNull;
|
||||||
|
|
||||||
|
@ -120,7 +121,7 @@ public abstract class LongByteArrayTest extends BaseCoreFunctionalTestCase {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void assertEquals(byte[] val1, byte[] val2) {
|
public static void assertEquals(byte[] val1, byte[] val2) {
|
||||||
if ( !ArrayHelper.isEquals( val1, val2 ) ) {
|
if ( !Arrays.equals( val1, val2 ) ) {
|
||||||
throw new AssertionFailedError( "byte arrays did not match" );
|
throw new AssertionFailedError( "byte arrays did not match" );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,21 +7,21 @@
|
||||||
package org.hibernate.test.sql.hand.custom;
|
package org.hibernate.test.sql.hand.custom;
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
import java.util.Arrays;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
|
|
||||||
import org.junit.Test;
|
|
||||||
|
|
||||||
import org.hibernate.LockMode;
|
import org.hibernate.LockMode;
|
||||||
import org.hibernate.Session;
|
import org.hibernate.Session;
|
||||||
import org.hibernate.Transaction;
|
import org.hibernate.Transaction;
|
||||||
import org.hibernate.internal.util.collections.ArrayHelper;
|
|
||||||
|
import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase;
|
||||||
import org.hibernate.test.sql.hand.Employment;
|
import org.hibernate.test.sql.hand.Employment;
|
||||||
import org.hibernate.test.sql.hand.ImageHolder;
|
import org.hibernate.test.sql.hand.ImageHolder;
|
||||||
import org.hibernate.test.sql.hand.Organization;
|
import org.hibernate.test.sql.hand.Organization;
|
||||||
import org.hibernate.test.sql.hand.Person;
|
import org.hibernate.test.sql.hand.Person;
|
||||||
import org.hibernate.test.sql.hand.TextHolder;
|
import org.hibernate.test.sql.hand.TextHolder;
|
||||||
import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase;
|
import org.junit.Test;
|
||||||
|
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
import static org.junit.Assert.assertFalse;
|
import static org.junit.Assert.assertFalse;
|
||||||
|
@ -145,7 +145,7 @@ public abstract class CustomSQLTestSupport extends BaseCoreFunctionalTestCase {
|
||||||
s = openSession();
|
s = openSession();
|
||||||
t = s.beginTransaction();
|
t = s.beginTransaction();
|
||||||
holder = ( ImageHolder ) s.get( ImageHolder.class, holder.getId() );
|
holder = ( ImageHolder ) s.get( ImageHolder.class, holder.getId() );
|
||||||
assertTrue( ArrayHelper.isEquals( photo, holder.getPhoto() ) );
|
assertTrue( Arrays.equals( photo, holder.getPhoto() ) );
|
||||||
photo = buildLongByteArray( 15000, false );
|
photo = buildLongByteArray( 15000, false );
|
||||||
holder.setPhoto( photo );
|
holder.setPhoto( photo );
|
||||||
s.save( holder );
|
s.save( holder );
|
||||||
|
@ -155,7 +155,7 @@ public abstract class CustomSQLTestSupport extends BaseCoreFunctionalTestCase {
|
||||||
s = openSession();
|
s = openSession();
|
||||||
t = s.beginTransaction();
|
t = s.beginTransaction();
|
||||||
holder = ( ImageHolder ) s.get( ImageHolder.class, holder.getId() );
|
holder = ( ImageHolder ) s.get( ImageHolder.class, holder.getId() );
|
||||||
assertTrue( ArrayHelper.isEquals( photo, holder.getPhoto() ) );
|
assertTrue( Arrays.equals( photo, holder.getPhoto() ) );
|
||||||
s.delete( holder );
|
s.delete( holder );
|
||||||
t.commit();
|
t.commit();
|
||||||
s.close();
|
s.close();
|
||||||
|
|
|
@ -9,6 +9,7 @@ package org.hibernate.test.sql.hand.query;
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.math.BigInteger;
|
import java.math.BigInteger;
|
||||||
|
import java.util.Arrays;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -29,7 +30,6 @@ import org.hibernate.dialect.H2Dialect;
|
||||||
import org.hibernate.dialect.MySQL5Dialect;
|
import org.hibernate.dialect.MySQL5Dialect;
|
||||||
import org.hibernate.engine.query.spi.sql.NativeSQLQueryReturn;
|
import org.hibernate.engine.query.spi.sql.NativeSQLQueryReturn;
|
||||||
import org.hibernate.engine.spi.NamedSQLQueryDefinitionBuilder;
|
import org.hibernate.engine.spi.NamedSQLQueryDefinitionBuilder;
|
||||||
import org.hibernate.internal.util.collections.ArrayHelper;
|
|
||||||
import org.hibernate.transform.BasicTransformerAdapter;
|
import org.hibernate.transform.BasicTransformerAdapter;
|
||||||
import org.hibernate.transform.DistinctRootEntityResultTransformer;
|
import org.hibernate.transform.DistinctRootEntityResultTransformer;
|
||||||
import org.hibernate.transform.Transformers;
|
import org.hibernate.transform.Transformers;
|
||||||
|
@ -867,7 +867,7 @@ public class NativeSQLQueriesTest extends BaseCoreFunctionalTestCase {
|
||||||
t = s.beginTransaction();
|
t = s.beginTransaction();
|
||||||
byte[] photoRead = ( byte[] ) s.createSQLQuery( getPhotosSQL() )
|
byte[] photoRead = ( byte[] ) s.createSQLQuery( getPhotosSQL() )
|
||||||
.uniqueResult();
|
.uniqueResult();
|
||||||
assertTrue( ArrayHelper.isEquals( photo, photoRead ) );
|
assertTrue( Arrays.equals( photo, photoRead ) );
|
||||||
s.delete( holder );
|
s.delete( holder );
|
||||||
t.commit();
|
t.commit();
|
||||||
s.close();
|
s.close();
|
||||||
|
|
|
@ -6,12 +6,10 @@
|
||||||
*/
|
*/
|
||||||
package org.hibernate.jpa.test.instrument.cases;
|
package org.hibernate.jpa.test.instrument.cases;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
import javax.persistence.EntityManager;
|
import javax.persistence.EntityManager;
|
||||||
|
|
||||||
import org.junit.Test;
|
|
||||||
|
|
||||||
import org.hibernate.Hibernate;
|
import org.hibernate.Hibernate;
|
||||||
import org.hibernate.internal.util.collections.ArrayHelper;
|
|
||||||
import org.hibernate.jpa.test.instrument.domain.EntityWithLazyProperty;
|
import org.hibernate.jpa.test.instrument.domain.EntityWithLazyProperty;
|
||||||
|
|
||||||
import static org.junit.Assert.assertFalse;
|
import static org.junit.Assert.assertFalse;
|
||||||
|
@ -97,7 +95,7 @@ public class TestLazyPropertyOnPreUpdateExecutable extends AbstractExecutable {
|
||||||
em.getTransaction().begin();
|
em.getTransaction().begin();
|
||||||
entity = em.find(EntityWithLazyProperty.class, entity.getId());
|
entity = em.find(EntityWithLazyProperty.class, entity.getId());
|
||||||
assertFalse( Hibernate.isPropertyInitialized( entity, "lazyData") );
|
assertFalse( Hibernate.isPropertyInitialized( entity, "lazyData") );
|
||||||
assertTrue( ArrayHelper.isEquals( expected, entity.getLazyData() ) );
|
assertTrue( Arrays.equals( expected, entity.getLazyData() ) );
|
||||||
assertTrue( Hibernate.isPropertyInitialized( entity, "lazyData" ) );
|
assertTrue( Hibernate.isPropertyInitialized( entity, "lazyData" ) );
|
||||||
em.getTransaction().commit();
|
em.getTransaction().commit();
|
||||||
em.close();
|
em.close();
|
||||||
|
|
Loading…
Reference in New Issue