diff --git a/main/java/org/infinispan/persistence/jpa/JpaStore.java b/main/java/org/infinispan/persistence/jpa/JpaStore.java index 24f5dc199365..ce98abe35afb 100644 --- a/main/java/org/infinispan/persistence/jpa/JpaStore.java +++ b/main/java/org/infinispan/persistence/jpa/JpaStore.java @@ -1,8 +1,13 @@ package org.infinispan.persistence.jpa; +import java.util.List; +import java.util.concurrent.Callable; +import java.util.concurrent.Executor; + import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.EntityTransaction; +import javax.persistence.FlushModeType; import javax.persistence.GeneratedValue; import javax.persistence.PersistenceException; import javax.persistence.Query; @@ -13,8 +18,6 @@ import javax.persistence.metamodel.ManagedType; import javax.persistence.metamodel.SingularAttribute; import javax.persistence.metamodel.Type; -import java.util.concurrent.Callable; -import java.util.concurrent.Executor; import org.infinispan.commons.marshall.StreamingMarshaller; import org.infinispan.executors.ExecutorAllCompletionService; @@ -120,15 +123,16 @@ public void clear() { try { log.trace("Clearing JPA Store"); String entityTable = em.getMetamodel().entity(configuration.entityClass()).getName(); - Query clearEntities = em.createQuery("DELETE FROM " + entityTable); - clearEntities.executeUpdate(); + @SuppressWarnings("unchecked") List items = em.createQuery("FROM " + entityTable).getResultList(); + for(Object o : items) + em.remove(o); if (configuration.storeMetadata()) { String metadataTable = em.getMetamodel().entity(MetadataEntity.class).getName(); Query clearMetadata = em.createQuery("DELETE FROM " + metadataTable); clearMetadata.executeUpdate(); } - em.clear(); txn.commit(); + em.clear(); break; } catch (Exception e) { log.trace("Failed to clear store", e); diff --git a/test/java/org/infinispan/persistence/jpa/JpaStorePersonEntityTest.java b/test/java/org/infinispan/persistence/jpa/JpaStorePersonEntityTest.java new file mode 100644 index 000000000000..9a31ea774d66 --- /dev/null +++ b/test/java/org/infinispan/persistence/jpa/JpaStorePersonEntityTest.java @@ -0,0 +1,42 @@ +package org.infinispan.persistence.jpa; + +import org.infinispan.persistence.jpa.entity.Address; +import org.infinispan.persistence.jpa.entity.Person; +import org.mockito.internal.util.collections.Sets; +import org.testng.annotations.Test; + +@Test(groups = "functional", testName = "persistence.JpaStorePersonEntityTest") +public class JpaStorePersonEntityTest extends BaseJpaStoreTest { + @Override + protected Class getEntityClass() { + return Person.class; + } + + @Override + protected TestObject createTestObject(String key) { + + Address adr = new Address(); + adr.setCity("Brno"); + adr.setStreet("Purkynova 2855"); + adr.setZipCode(61200); + + Address secAdr1 = new Address(); + secAdr1.setCity("Brno - Kralovo Pole"); + secAdr1.setStreet("Purkynova 97"); + secAdr1.setZipCode(12345); + + Address secAdr2 = new Address(); + secAdr2.setCity("Kralovo Pole"); + secAdr2.setStreet("Purkynova 97a"); + secAdr2.setZipCode(54321); + + Person person = new Person(); + person.setId(key); + person.setName("test person"); + person.setNickNames(Sets.newSet("nick1", "nick2")); + person.setAddress(adr); + person.setSecondaryAdresses(Sets.newSet(secAdr1, secAdr2)); + + return new TestObject(person.getId(), person); + } +} diff --git a/test/java/org/infinispan/persistence/jpa/entity/Address.java b/test/java/org/infinispan/persistence/jpa/entity/Address.java new file mode 100644 index 000000000000..52cbbb253325 --- /dev/null +++ b/test/java/org/infinispan/persistence/jpa/entity/Address.java @@ -0,0 +1,71 @@ +package org.infinispan.persistence.jpa.entity; + +import java.io.Serializable; + +import javax.persistence.Embeddable; + +@Embeddable +public class Address implements Serializable { + + private static final long serialVersionUID = 5289488219505339148L; + + private String city; + private String street; + private int zipCode; + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public String getStreet() { + return street; + } + + public void setStreet(String street) { + this.street = street; + } + + public int getZipCode() { + return zipCode; + } + + public void setZipCode(int zipCode) { + this.zipCode = zipCode; + } + + public static long getSerialversionuid() { + return serialVersionUID; + } + + public boolean equals(Object o) { + if (this == o) + return true; + if (o == null || getClass() != o.getClass()) + return false; + + final Address address = (Address) o; + + if (city != null ? !city.equals(address.getCity()) : address.getCity() != null) + return false; + if (street != null ? !street.equals(address.getStreet()) : address.getStreet() != null) + return false; + if (zipCode != address.getZipCode()) + return false; + + return true; + } + + public int hashCode() { + final int prime = 31; + int result; + result = (city != null ? city.hashCode() : 0); + result = prime * result + (street != null ? street.hashCode() : 0); + result = prime * result + zipCode; + return result; + } + +} diff --git a/test/java/org/infinispan/persistence/jpa/entity/Person.java b/test/java/org/infinispan/persistence/jpa/entity/Person.java new file mode 100644 index 000000000000..a6dfb9b496f0 --- /dev/null +++ b/test/java/org/infinispan/persistence/jpa/entity/Person.java @@ -0,0 +1,110 @@ +package org.infinispan.persistence.jpa.entity; + +import java.io.Serializable; +import java.util.Set; + +import javax.persistence.AttributeOverride; +import javax.persistence.AttributeOverrides; +import javax.persistence.Column; +import javax.persistence.ElementCollection; +import javax.persistence.Embedded; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.Id; + +@Entity +public class Person implements Serializable { + + private static final long serialVersionUID = 4748311041613897465L; + + @Id + private String id; + + private String name; + + @ElementCollection(fetch = FetchType.EAGER) + private Set nickNames; + + @Embedded + @AttributeOverrides({ @AttributeOverride(name = "zipCode", column = @Column(name = "zip")) }) + private Address address; + + @ElementCollection(fetch = FetchType.EAGER) + private Set
secondaryAdresses; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Set getNickNames() { + return nickNames; + } + + public void setNickNames(Set nickNames) { + this.nickNames = nickNames; + } + + public Address getAddress() { + return address; + } + + public void setAddress(Address address) { + this.address = address; + } + + public Set
getSecondaryAdresses() { + return secondaryAdresses; + } + + public void setSecondaryAdresses(Set
secondaryAdresses) { + this.secondaryAdresses = secondaryAdresses; + } + + public boolean equals(Object o) { + if (this == o) + return true; + if (o == null || getClass() != o.getClass()) + return false; + + final Person person = (Person) o; + + if (id != null ? !id.equals(person.getId()) : person.getId() != null) + return false; + if (name != null ? !name.equals(person.getName()) : person.getName() != null) + return false; + if ( (nickNames != null && !nickNames.isEmpty()) ? !nickNames.equals(person.getNickNames()) : + (person.getNickNames() != null && !person.getNickNames().isEmpty())) + return false; + if (address != null ? !address.equals(person.getAddress()) : person.getAddress() != null) + return false; + if ( (secondaryAdresses != null && !secondaryAdresses.isEmpty() ) ? !secondaryAdresses.equals(person.getSecondaryAdresses()) : + (person.getSecondaryAdresses() != null && !person.getSecondaryAdresses().isEmpty())) + return false; + + return true; + } + + public int hashCode() { + final int prime = 31; + int result; + result = (id != null ? id.hashCode() : 0); + result = prime * result + (name != null ? name.hashCode() : 0); + result = prime * result + (nickNames != null ? nickNames.hashCode() : 0); + result = prime * result + (address != null ? address.hashCode() : 0); + result = prime * result + (secondaryAdresses != null ? secondaryAdresses.hashCode() : 0); + return result; + } + +} diff --git a/test/resources/META-INF/persistence.xml b/test/resources/META-INF/persistence.xml index c4389af35e6c..bf22af88be95 100644 --- a/test/resources/META-INF/persistence.xml +++ b/test/resources/META-INF/persistence.xml @@ -8,6 +8,7 @@ org.infinispan.persistence.jpa.MetadataEntity org.infinispan.persistence.jpa.entity.Document org.infinispan.persistence.jpa.entity.KeyValueEntity + org.infinispan.persistence.jpa.entity.Person org.infinispan.persistence.jpa.entity.User org.infinispan.persistence.jpa.entity.Vehicle @@ -28,6 +29,7 @@ org.infinispan.persistence.jpa.MetadataEntity org.infinispan.persistence.jpa.entity.Document org.infinispan.persistence.jpa.entity.KeyValueEntity + org.infinispan.persistence.jpa.entity.Person org.infinispan.persistence.jpa.entity.User org.infinispan.persistence.jpa.entity.Vehicle