package kr.debop4j.data.ogm.test.associations.collection.manytomany;
import kr.debop4j.data.ogm.test.simpleentity.OgmTestBase;
import kr.debop4j.data.ogm.test.utils.TestHelper;
import lombok.extern.slf4j.Slf4j;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Assert;
import org.junit.Ignore;
import org.junit.Test;
import static org.fest.assertions.Assertions.assertThat;
/**
* ManyToManyTest
*
* @author 배성혁 ( sunghyouk.bae@gmail.com )
* 13. 3. 29. 오후 9:10
*/
@Slf4j
public class ManyToManyTest extends OgmTestBase {
@Test
public void mappingTest() {
Session session = openSession();
Assert.assertNotNull(session);
session.close();
}
@Test
@Ignore("hibernate-core 4.2.2.Final 이상에서는 예외가 발생합니다.")
public void manyToManyTest() {
Session session = openSession();
Transaction tx = session.beginTransaction();
AccountOwner owner = new AccountOwner();
owner.setSSN("0123456");
BankAccount soge = new BankAccount();
soge.setAccountNumber("X2345000");
owner.getBankAccounts().add(soge);
soge.getOwners().add(owner);
// mappedBy 가 AccountOwner로 설정되었다는 것은 AccountOwner 를 기준으로 cascading 이 된다는 뜻이다.
session.persist(owner);
tx.commit();
assertThat(TestHelper.assertNumberOfEntities(2, sessions)).isTrue();
assertThat(TestHelper.assertNumberOfAssociations(2, sessions)).isTrue();
session.clear();
// read from inverse side
tx = session.beginTransaction();
soge = TestHelper.get(session, BankAccount.class, soge.getId());
Assert.assertEquals(1, soge.getOwners().size());
assertThat(soge.getOwners()).hasSize(1);
assertThat(soge.getOwners()).onProperty("id").contains(owner.getId());
tx.commit();
session.clear();
// read from non-inverse side and update data
tx = session.beginTransaction();
owner = TestHelper.get(session, AccountOwner.class, owner.getId());
assertThat(owner.getBankAccounts()).hasSize(1);
assertThat(owner.getBankAccounts()).onProperty("id").contains(soge.getId());
soge = owner.getBankAccounts().iterator().next();
soge.getOwners().remove(owner);
owner.getBankAccounts().remove(soge);
BankAccount barclays = new BankAccount();
barclays.setAccountNumber("ZZZ-009");
barclays.getOwners().add(owner);
owner.getBankAccounts().add(barclays);
session.delete(soge);
//session.saveOrUpdate(owner);
tx.commit();
assertThat(TestHelper.assertNumberOfEntities(2, sessions)).isTrue();
assertThat(TestHelper.assertNumberOfAssociations(2, sessions)).isTrue();
session.clear();
//delete data
tx = session.beginTransaction();
owner = TestHelper.get(session, AccountOwner.class, owner.getId());
assertThat(owner.getBankAccounts()).hasSize(1);
assertThat(owner.getBankAccounts()).onProperty("id").contains(barclays.getId());
barclays = owner.getBankAccounts().iterator().next();
barclays.getOwners().clear();
owner.getBankAccounts().clear();
session.delete(barclays);
session.delete(owner);
tx.commit();
assertThat(TestHelper.assertNumberOfEntities(0, sessions)).isTrue();
assertThat(TestHelper.assertNumberOfAssociations(0, sessions)).isTrue();
session.close();
checkCleanCache();
}
@Override
protected Class<?>[] getAnnotatedClasses() {
return new Class<?>[] {
AccountOwner.class,
BankAccount.class
};
}
}