EntityManager em = getEntityManager();
StrTestEntity str1 = new StrTestEntity("a");
StrTestEntity str2 = new StrTestEntity("b");
IntTestEntity int1 = new IntTestEntity(1);
IntTestEntity int2 = new IntTestEntity(2);
TernaryMapEntity map1 = new TernaryMapEntity();
TernaryMapEntity map2 = new TernaryMapEntity();
// Revision 1 (map1: initialy one mapping int1 -> str1, map2: empty)
em.getTransaction().begin();
em.persist(str1);
em.persist(str2);
em.persist(int1);
em.persist(int2);
map1.getMap().put(int1, str1);
em.persist(map1);
em.persist(map2);
em.getTransaction().commit();
// Revision 2 (map1: replacing the mapping, map2: adding two mappings)
em.getTransaction().begin();
map1 = em.find(TernaryMapEntity.class, map1.getId());
map2 = em.find(TernaryMapEntity.class, map2.getId());
str1 = em.find(StrTestEntity.class, str1.getId());
str2 = em.find(StrTestEntity.class, str2.getId());
int1 = em.find(IntTestEntity.class, int1.getId());
int2 = em.find(IntTestEntity.class, int2.getId());
map1.getMap().put(int1, str2);
map2.getMap().put(int1, str1);
map2.getMap().put(int2, str1);
em.getTransaction().commit();
// Revision 3 (map1: removing a non-existing mapping, adding an existing mapping - no changes, map2: removing a mapping)
em.getTransaction().begin();
map1 = em.find(TernaryMapEntity.class, map1.getId());
map2 = em.find(TernaryMapEntity.class, map2.getId());
str2 = em.find(StrTestEntity.class, str2.getId());
int1 = em.find(IntTestEntity.class, int1.getId());
int2 = em.find(IntTestEntity.class, int2.getId());
map1.getMap().remove(int2);
map1.getMap().put(int1, str2);
map2.getMap().remove(int1);
em.getTransaction().commit();
// Revision 4 (map1: adding a mapping, map2: adding a mapping)
em.getTransaction().begin();
map1 = em.find(TernaryMapEntity.class, map1.getId());
map2 = em.find(TernaryMapEntity.class, map2.getId());
str2 = em.find(StrTestEntity.class, str2.getId());
int1 = em.find(IntTestEntity.class, int1.getId());
int2 = em.find(IntTestEntity.class, int2.getId());
map1.getMap().put(int2, str2);
map2.getMap().put(int1, str2);
em.getTransaction().commit();
//
map1_id = map1.getId();
map2_id = map2.getId();
str1_id = str1.getId();
str2_id = str2.getId();
int1_id = int1.getId();
int2_id = int2.getId();
}