package kr.debop4j.data.ogm.test.associations.collection.types;
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 org.fest.assertions.Assertions.assertThat;
/**
* kr.debop4j.data.ogm.test.associations.collection.type.ListAndMapTest
*
* @author 배성혁 ( sunghyouk.bae@gmail.com )
* @since 13. 4. 2. 오전 11:18
*/
@Slf4j
public class ListAndMapTest extends OgmTestBase {
@Override
protected Class<?>[] getAnnotatedClasses() {
return new Class<?>[] {
User.class,
Address.class,
Father.class,
Child.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 orderedListTest() throws Exception {
Transaction tx = session.beginTransaction();
Child luke = new Child("luke");
Child leia = new Child("leia");
session.persist(luke);
session.persist(leia);
Father father = new Father();
father.getOrderedChildren().add(luke);
father.getOrderedChildren().add(null);
father.getOrderedChildren().add(leia);
session.persist(father);
tx.commit();
session.clear();
tx = session.beginTransaction();
father = (Father) session.get(Father.class, father.getId());
assertThat(father.getOrderedChildren())
.as("List should have 3 elements")
.hasSize(3);
assertThat(father.getOrderedChildren().get(0).getName())
.as("Luke should be first")
.isEqualTo(luke.getName());
assertThat(father.getOrderedChildren().get(1))
.as("Second born should be null")
.isNull();
assertThat(father.getOrderedChildren().get(2).getName())
.as("Leia should be third")
.isEqualTo(leia.getName());
session.delete(father);
// cascade delete가 되었습니다.
// session.delete(session.load(Child.class, luke.getId()));
// session.delete(session.load(Child.class, leia.getId()));
tx.commit();
checkCleanCache();
}
@Test
public void mapAndElementCollection() throws Exception {
Address home = new Address();
home.setCity("Paris");
Address work = new Address();
work.setCity("San Francisco");
User user = new User();
user.getAddresses().put("home", home);
user.getAddresses().put("work", work);
user.getNicknames().add("idrA");
user.getNicknames().add("day[9]");
session.persist(home);
session.persist(work);
session.persist(user);
User user2 = new User();
user2.getNicknames().add("idrA");
user2.getNicknames().add("day[9]");
session.persist(user2);
session.flush();
session.clear();
user = (User) session.get(User.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");
session.flush();
session.clear();
user = (User) session.get(User.class, user.getId());
// TODO do null value
assertThat(user.getAddresses())
.as("List should have 2 elements")
.hasSize(2);
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]");
session.delete(user);
// CascadeType.ALL 로 user 삭제 시 address 삭제 됨
// session.delete(session.load(Address.class, home.getId()));
// session.delete(session.load(Address.class, work.getId()));
user2 = (User) session.get(User.class, user2.getId());
assertThat(user2.getNicknames())
.as("Should have 2 nicks")
.hasSize(2);
assertThat(user2.getNicknames())
.as("Should contain nick")
.contains("idrA", "day[9]");
session.delete(user2);
session.flush();
checkCleanCache();
}
}