package org.hibernate.examples.mapping.associations.manytomany;
import lombok.extern.slf4j.Slf4j;
import org.hibernate.examples.AbstractJpaTest;
import org.junit.Test;
import org.springframework.transaction.annotation.Transactional;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import static org.assertj.core.api.Assertions.assertThat;
/**
* org.hibernate.examples.mapping.associations.manytomany.ManyToManyTest
*
* @author 배성혁 sunghyouk.bae@gmail.com
* @since 2013. 11. 28. 오후 11:45
*/
@Slf4j
@Transactional
public class ManyToManyTest extends AbstractJpaTest {
@PersistenceContext
EntityManager em;
@Test
public void manyToManyTest() throws Exception {
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 이 된다는 뜻이다.
em.persist(owner);
em.flush();
em.clear();
// read from inverse side
soge = em.find(BankAccount.class, soge.getId());
assertThat(soge.getOwners()).hasSize(1);
// assertThat(soge.getOwners()).onProperty("id").contains(owner.getId());
em.clear();
// read from non-inverse side and update data
owner = em.find(AccountOwner.class, owner.getId());
assertThat(owner.getBankAccounts().size()).isEqualTo(1);
// assertThat(owner.getBankAccounts()).onProperty("id").contains(soge.getId());
soge = owner.getBankAccounts().iterator().next();
log.debug("BankAccount=[{}]", soge);
owner.getBankAccounts().remove(soge);
BankAccount barclays = new BankAccount();
barclays.setAccountNumber("ZZZ-009");
barclays.getOwners().add(owner);
owner.getBankAccounts().add(barclays);
em.remove(soge);
em.flush();
em.clear();
// del data
owner = em.find(AccountOwner.class, owner.getId());
assertThat(owner.getBankAccounts().size()).isEqualTo(1);
assertThat(owner.getBankAccounts().iterator().next().getId()).isEqualTo(barclays.getId());
for (BankAccount account : owner.getBankAccounts()) {
log.debug("BankAccount=[{}]", account);
}
barclays = owner.getBankAccounts().iterator().next();
barclays.getOwners().clear();
owner.getBankAccounts().clear();
em.flush();
}
}