package kr.debop4j.data.ogm.test.associations.manytoone;
import kr.debop4j.data.ogm.test.simpleentity.OgmTestBase;
import kr.debop4j.data.ogm.test.utils.TestHelper;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;
import static org.fest.assertions.Assertions.assertThat;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
/**
* kr.debop4j.data.ogm.test.associations.manytoone.ManyToOneTest
*
* @author 배성혁 ( sunghyouk.bae@gmail.com )
* @since 13. 4. 2. 오후 12:08
*/
@Slf4j
public class ManyToOneTest extends OgmTestBase {
@Override
protected Class<?>[] getAnnotatedClasses() {
return new Class<?>[] {
Jug.class,
Member.class,
SalesForce.class,
SalesGuy.class,
Beer.class,
Brewery.class
};
}
@Getter
private Session session;
@Override
public void doBefore() throws Exception {
super.doBefore();
session = openSession();
}
@Override
public void doAfter() throws Exception {
if (session != null)
session.close();
super.doAfter();
}
@Test
public void uniDirectionalManyToOne() throws Exception {
Transaction transaction = session.beginTransaction();
Jug jug = new Jug("JUG Summer Camp");
Member emmanuel = new Member("Emmanuel Bernard");
emmanuel.setMemberOf(jug);
Member jerome = new Member("Jerome");
jerome.setMemberOf(jug);
session.persist(jug);
session.persist(emmanuel);
session.persist(jerome);
session.flush();
assertThat(TestHelper.assertNumberOfEntities(3, sessions)).isTrue();
assertThat(TestHelper.assertNumberOfAssociations(0, sessions)).isTrue();
transaction.commit();
assertThat(TestHelper.assertNumberOfEntities(3, sessions)).isTrue();
assertThat(TestHelper.assertNumberOfAssociations(0, sessions)).isTrue();
session.clear();
transaction = session.beginTransaction();
emmanuel = (Member) session.get(Member.class, emmanuel.getId());
jug = emmanuel.getMemberOf();
session.delete(emmanuel);
jerome = (Member) session.get(Member.class, jerome.getId());
session.delete(jerome);
session.delete(jug);
transaction.commit();
assertThat(TestHelper.assertNumberOfEntities(0, sessions)).isTrue();
assertThat(TestHelper.assertNumberOfAssociations(0, sessions)).isTrue();
checkCleanCache();
}
@Test
public void testBidirectionalManyToOneRegular() throws Exception {
Transaction transaction = session.beginTransaction();
SalesForce force = new SalesForce("Red Hat");
session.save(force);
SalesGuy eric = new SalesGuy();
eric.setName("Eric");
eric.setSalesForce(force);
force.getSalesGuys().add(eric);
session.save(eric);
SalesGuy simon = new SalesGuy();
simon.setName("Simon");
simon.setSalesForce(force);
force.getSalesGuys().add(simon);
session.save(simon);
transaction.commit();
session.clear();
transaction = session.beginTransaction();
force = (SalesForce) session.get(SalesForce.class, force.getId());
assertNotNull(force.getSalesGuys());
assertEquals(2, force.getSalesGuys().size());
simon = (SalesGuy) session.get(SalesGuy.class, simon.getId());
// Cascade 때문에
force.getSalesGuys().remove(simon);
session.delete(simon);
transaction.commit();
session.clear();
transaction = session.beginTransaction();
force = (SalesForce) session.get(SalesForce.class, force.getId());
assertNotNull(force.getSalesGuys());
assertEquals(1, force.getSalesGuys().size());
session.delete(force.getSalesGuys().iterator().next());
session.delete(force);
transaction.commit();
checkCleanCache();
}
@Test
public void testBiDirManyToOneInsertUpdateFalse() throws Exception {
Transaction tx = session.beginTransaction();
Beer hoegaarden = new Beer();
Brewery hoeBrewery = new Brewery();
hoeBrewery.getBeers().add(hoegaarden);
hoegaarden.setBrewery(hoeBrewery);
session.persist(hoeBrewery);
tx.commit();
session.clear();
tx = session.beginTransaction();
hoegaarden = TestHelper.get(session, Beer.class, hoegaarden.getId());
assertThat(hoegaarden)
.isNotNull();
assertThat(hoegaarden.getBrewery())
.isNotNull();
assertThat(hoegaarden.getBrewery().getBeers())
.hasSize(1)
.containsOnly(hoegaarden);
Beer citron = new Beer();
hoeBrewery = hoegaarden.getBrewery();
hoeBrewery.getBeers().remove(hoegaarden);
hoeBrewery.getBeers().add(citron);
citron.setBrewery(hoeBrewery);
session.delete(hoegaarden);
tx.commit();
session.clear();
tx = session.beginTransaction();
citron = TestHelper.get(session, Beer.class, citron.getId());
assertThat(citron.getBrewery().getBeers())
.hasSize(1)
.containsOnly(citron);
hoeBrewery = citron.getBrewery();
citron.setBrewery(null);
hoeBrewery.getBeers().clear();
session.delete(citron);
session.delete(hoeBrewery);
tx.commit();
checkCleanCache();
}
}