package org.hibernate.examples.mapping.associations.onetomany;
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.onetomany.OneToManyTest
*
* @author 배성혁 sunghyouk.bae@gmail.com
* @since 2013. 11. 29. 오후 2:28
*/
@Slf4j
@Transactional
public class OneToManyTest extends AbstractJpaTest {
@PersistenceContext
EntityManager em;
@Test
public void mapAndElementCollection() throws Exception {
OneToManyAddress home = new OneToManyAddress();
home.setCity("Paris");
OneToManyAddress work = new OneToManyAddress();
work.setCity("San Francisco");
OneToManyUser user = new OneToManyUser();
user.getAddresses().put("home", home);
user.getAddresses().put("work", work);
user.getNicknames().add("idrA");
user.getNicknames().add("day[9]");
em.persist(home);
em.persist(work);
em.persist(user);
OneToManyUser user2 = new OneToManyUser();
user2.getNicknames().add("idrA");
user2.getNicknames().add("day[9]");
em.persist(user2);
em.flush();
em.clear();
user = em.find(OneToManyUser.class, user.getId());
assertThat(user.getNicknames()).as("Should have 2 nick1").hasSize(2);
assertThat(user.getNicknames()).as("Should contain nicks").contains("idrA", "day[9]");
user.getNicknames().remove("idrA");
user.getAddresses().remove("work");
em.persist(user);
em.flush();
em.clear();
user = em.find(OneToManyUser.class, user.getId());
// TODO do null value
assertThat(user.getAddresses()).as("List should have 1 elements").hasSize(1);
assertThat(user.getAddresses().get("home").getCity()).as("home address should be under home").isEqualTo(home.getCity());
assertThat(user.getNicknames()).as("Should have 1 nick1").hasSize(1);
assertThat(user.getNicknames()).as("Should contain nick").contains("day[9]");
em.remove(user);
// CascadeType.ALL 로 user 삭제 시 address 삭제 됨
// em.srem(em.load(Address.class, home.getId()));
// em.srem(em.load(Address.class, work.getId()));
user2 = em.find(OneToManyUser.class, user2.getId());
assertThat(user2.getNicknames()).as("Should have 2 nicks").hasSize(2);
assertThat(user2.getNicknames()).as("Should contain nick").contains("idrA", "day[9]");
em.remove(user2);
em.flush();
}
}