package kr.debop4j.data.ogm.test.associations.collection.unidirectional;
import kr.debop4j.data.ogm.test.simpleentity.OgmTestBase;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;
import static kr.debop4j.data.ogm.test.utils.TestHelper.assertNumberOfAssociations;
import static kr.debop4j.data.ogm.test.utils.TestHelper.assertNumberOfEntities;
import static org.fest.assertions.Assertions.assertThat;
import static org.junit.Assert.*;
/**
* kr.debop4j.data.ogm.test.associations.collection.unidirectional.CollectionUnidirectionalTest
*
* @author 배성혁 ( sunghyouk.bae@gmail.com )
* @since 13. 4. 2. 오후 12:58
*/
@Slf4j
public class CollectionUnidirectionalTest extends OgmTestBase {
@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 unidirectionalCollection() throws Exception {
Transaction transaction = session.beginTransaction();
SnowFlake sf = new SnowFlake();
sf.setDescription("Snowflake 1");
session.save(sf);
SnowFlake sf2 = new SnowFlake();
sf2.setDescription("Snowflake 2");
session.save(sf2);
Cloud cloud = new Cloud();
cloud.setLength(23);
cloud.getProducedSnowFlakes().add(sf);
cloud.getProducedSnowFlakes().add(sf2);
session.persist(cloud);
session.flush();
assertThat(assertNumberOfEntities(3, sessions)).isTrue();
assertThat(assertNumberOfAssociations(1, sessions)).isTrue();
transaction.commit();
assertThat(assertNumberOfEntities(3, sessions)).isTrue();
assertThat(assertNumberOfAssociations(1, sessions)).isTrue();
session.clear();
transaction = session.beginTransaction();
cloud = (Cloud) session.get(Cloud.class, cloud.getId());
assertNotNull(cloud.getProducedSnowFlakes());
assertEquals(2, cloud.getProducedSnowFlakes().size());
final SnowFlake removedSf = cloud.getProducedSnowFlakes().iterator().next();
SnowFlake sf3 = new SnowFlake();
sf3.setDescription("Snowflake 3");
session.persist(sf3);
cloud.getProducedSnowFlakes().remove(removedSf);
cloud.getProducedSnowFlakes().add(sf3);
transaction.commit();
assertThat(assertNumberOfEntities(4, sessions)).isTrue();
assertThat(assertNumberOfAssociations(1, sessions)).isTrue();
session.clear();
transaction = session.beginTransaction();
cloud = (Cloud) session.get(Cloud.class, cloud.getId());
assertNotNull(cloud.getProducedSnowFlakes());
assertEquals(2, cloud.getProducedSnowFlakes().size());
boolean present = false;
for (SnowFlake current : cloud.getProducedSnowFlakes()) {
if (current.getDescription().equals(removedSf.getDescription())) {
present = true;
}
}
assertFalse("flake not removed", present);
for (SnowFlake current : cloud.getProducedSnowFlakes()) {
session.delete(current);
}
session.delete(session.load(SnowFlake.class, removedSf.getId()));
cloud.getProducedSnowFlakes().clear();
transaction.commit();
assertThat(assertNumberOfEntities(1, sessions)).isTrue();
assertThat(assertNumberOfAssociations(0, sessions)).isTrue();
session.clear();
transaction = session.beginTransaction();
cloud = (Cloud) session.get(Cloud.class, cloud.getId());
assertNotNull(cloud.getProducedSnowFlakes());
assertEquals(0, cloud.getProducedSnowFlakes().size());
session.delete(cloud);
session.flush();
transaction.commit();
assertThat(assertNumberOfEntities(0, sessions)).isTrue();
assertThat(assertNumberOfAssociations(0, sessions)).isTrue();
checkCleanCache();
}
@Override
protected Class<?>[] getAnnotatedClasses() {
return new Class<?>[] {
Cloud.class,
SnowFlake.class
};
}
}