/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
*/
package org.hibernate.jpa.test.emops;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import org.junit.Assert;
import org.junit.Test;
import org.hibernate.jpa.test.BaseEntityManagerFunctionalTestCase;
import org.hibernate.testing.TestForIssue;
/**
* @author Emmanuel Bernard
*/
public class FlushTest extends BaseEntityManagerFunctionalTestCase {
private static Set<String> names = namesSet();
private static Set<String> namesSet() {
HashSet<String> names = new HashSet<String>();
names.add("Toonses");
names.add("Sox");
names.add("Winnie");
names.add("Junior");
return names;
}
@Override
public Class[] getAnnotatedClasses() {
return new Class[] {
Pet.class,
Dog.class,
Cat.class,
Decorate.class
};
}
@Test
@TestForIssue( jiraKey = "EJBTHREE-722" )
public void testFlushOnDetached() throws Exception {
EntityManager manager = getOrCreateEntityManager( );
manager.getTransaction().begin();
Pet p1 = createCat("Toonses", 15.0, 9, manager);
manager.flush();
manager.clear();
Pet p2 = createCat("Sox", 10.0, 5, manager);
manager.flush();
manager.clear();
Pet p3 = createDog("Winnie", 70.0, 5, manager);
manager.flush();
manager.clear();
Pet p4 = createDog("Junior", 11.0, 1, manager);
manager.flush();
manager.clear();
Decorate d1 = createDecorate("Test", p1, manager);
manager.flush();
manager.clear();
Decorate d2 = createDecorate("Test2", p2, manager);
manager.flush();
manager.clear();
List l = findByWeight(14.0, manager);
manager.flush();
manager.clear();
for (Object o : l) {
Assert.assertTrue( names.contains( ((Pet) o).getName() ) );
}
Collection<Decorate> founds = getDecorate(manager);
manager.flush();
manager.clear();
for (Decorate value : founds) {
Assert.assertTrue( names.contains( value.getPet().getName() ) );
}
manager.getTransaction().rollback();
manager.close();
}
private Dog createDog(String name, double weight, int bones, EntityManager manager) {
Dog dog = new Dog();
dog.setName(name);
dog.setWeight(weight);
dog.setNumBones(bones);
manager.persist(dog);
return dog;
}
private Cat createCat(String name, double weight, int lives, EntityManager manager) {
Cat cat = new Cat();
cat.setName(name);
cat.setWeight(weight);
cat.setLives(lives);
manager.persist(cat);
return cat;
}
private List findByWeight(double weight, EntityManager manager) {
return manager.createQuery(
"select p from Pet p where p.weight < :weight").setParameter(
"weight", weight).getResultList();
}
private Decorate createDecorate(String name, Pet pet, EntityManager manager) {
Decorate dec = new Decorate();
dec.setName(name);
dec.setPet(pet);
manager.persist(dec);
return dec;
}
private Collection<Decorate> getDecorate(EntityManager manager) {
Collection<Decorate> founds = new ArrayList<Decorate>();
Query query = manager.createQuery("SELECT o FROM Decorate o");
List list = query.getResultList();
for (Object obj : list) {
if (obj instanceof Decorate) {
Decorate decorate = (Decorate) obj;
founds.add( decorate );
decorate.getPet().getName(); //load
}
}
return founds;
}
}