Skip to content

Commit

Permalink
ISPN-4072 JPA Cache Store fails to clear entity which conatins Elemen…
Browse files Browse the repository at this point in the history
…tCollection

* Fix ISPN-4072
* Add unit tests for entity containing fields with annotations
@Embedded and @ElementCollection
  • Loading branch information
vjuranek authored and Mircea Markus committed Mar 20, 2014
1 parent 0e03f75 commit 27834fb
Show file tree
Hide file tree
Showing 5 changed files with 234 additions and 5 deletions.
14 changes: 9 additions & 5 deletions main/java/org/infinispan/persistence/jpa/JpaStore.java
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -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<Object> 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);
Expand Down
Original file line number Diff line number Diff line change
@@ -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);
}
}
71 changes: 71 additions & 0 deletions test/java/org/infinispan/persistence/jpa/entity/Address.java
Original file line number Diff line number Diff line change
@@ -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;
}

}
110 changes: 110 additions & 0 deletions test/java/org/infinispan/persistence/jpa/entity/Person.java
Original file line number Diff line number Diff line change
@@ -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<String> nickNames;

@Embedded
@AttributeOverrides({ @AttributeOverride(name = "zipCode", column = @Column(name = "zip")) })
private Address address;

@ElementCollection(fetch = FetchType.EAGER)
private Set<Address> 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<String> getNickNames() {
return nickNames;
}

public void setNickNames(Set<String> nickNames) {
this.nickNames = nickNames;
}

public Address getAddress() {
return address;
}

public void setAddress(Address address) {
this.address = address;
}

public Set<Address> getSecondaryAdresses() {
return secondaryAdresses;
}

public void setSecondaryAdresses(Set<Address> 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;
}

}
2 changes: 2 additions & 0 deletions test/resources/META-INF/persistence.xml
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
<class>org.infinispan.persistence.jpa.MetadataEntity</class>
<class>org.infinispan.persistence.jpa.entity.Document</class>
<class>org.infinispan.persistence.jpa.entity.KeyValueEntity</class>
<class>org.infinispan.persistence.jpa.entity.Person</class>
<class>org.infinispan.persistence.jpa.entity.User</class>
<class>org.infinispan.persistence.jpa.entity.Vehicle</class>
<properties>
Expand All @@ -28,6 +29,7 @@
<class>org.infinispan.persistence.jpa.MetadataEntity</class>
<class>org.infinispan.persistence.jpa.entity.Document</class>
<class>org.infinispan.persistence.jpa.entity.KeyValueEntity</class>
<class>org.infinispan.persistence.jpa.entity.Person</class>
<class>org.infinispan.persistence.jpa.entity.User</class>
<class>org.infinispan.persistence.jpa.entity.Vehicle</class>
<properties>
Expand Down

0 comments on commit 27834fb

Please sign in to comment.