/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* Copyright (c) 2011, Red Hat Inc. or third-party contributors as
* indicated by the @author tags or express copyright attribution
* statements applied by the authors. All third-party contributions are
* distributed under license by Red Hat Inc.
*
* This copyrighted material is made available to anyone wishing to use, modify,
* copy, or redistribute it subject to the terms and conditions of the GNU
* Lesser General Public License, as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
* for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this distribution; if not, write to:
* Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301 USA
*/
package org.hibernate.ejb.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.hibernate.ejb.test.BaseEntityManagerFunctionalTestCase;
import org.junit.Assert;
import org.junit.Test;
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;
}
}