@Test public void testMergeMultipleEntityCopiesAllowed() { Item item1 = new Item(); item1.setName("item1"); Hoarder hoarder = new Hoarder(); hoarder.setName("joe"); EntityManager em = getOrCreateEntityManager(); em.getTransaction().begin(); em.persist(item1); em.persist(hoarder); em.getTransaction().commit(); em.close(); // Get another representation of the same Item from a different EntityManager. em = getOrCreateEntityManager(); Item item1_1 = em.find(Item.class, item1.getId()); em.close(); // item1_1 and item1_2 are unmodified representations of the same persistent entity. assertFalse(item1 == item1_1); assertTrue(item1.equals(item1_1)); // Update hoarder (detached) to references both representations. hoarder.getItems().add(item1); hoarder.setFavoriteItem(item1_1); em = getOrCreateEntityManager(); em.getTransaction().begin(); // the merge should succeed because it does not have Category copies. // (CustomEntityCopyObserver does not allow Category copies; it does allow Item copies) hoarder = em.merge(hoarder); assertEquals(1, hoarder.getItems().size()); assertSame(hoarder.getFavoriteItem(), hoarder.getItems().iterator().next()); assertEquals(item1.getId(), hoarder.getFavoriteItem().getId()); assertEquals(item1.getCategory(), hoarder.getFavoriteItem().getCategory()); em.getTransaction().commit(); em.close(); em = getOrCreateEntityManager(); em.getTransaction().begin(); hoarder = em.find(Hoarder.class, hoarder.getId()); assertEquals(1, hoarder.getItems().size()); assertSame(hoarder.getFavoriteItem(), hoarder.getItems().iterator().next()); assertEquals(item1.getId(), hoarder.getFavoriteItem().getId()); assertEquals(item1.getCategory(), hoarder.getFavoriteItem().getCategory()); em.getTransaction().commit(); em.close(); cleanup(); }
@Test public void testCascadeFromDetachedToNonDirtyRepresentations() { Item item1 = new Item(); item1.setName("item1"); Hoarder hoarder = new Hoarder(); hoarder.setName("joe"); Session s = openSession(); Transaction tx = session.beginTransaction(); s.persist(item1); s.persist(hoarder); tx.commit(); s.close(); // Get another representation of the same Item from a different session. s = openSession(); Item item1_1 = (Item) s.get(Item.class, item1.getId()); s.close(); // item1_1 and item1_2 are unmodified representations of the same persistent entity. assertFalse(item1 == item1_1); assertTrue(item1.equals(item1_1)); // Update hoarder (detached) to references both representations. hoarder.getItems().add(item1); hoarder.setFavoriteItem(item1_1); s = openSession(); tx = s.beginTransaction(); hoarder = (Hoarder) s.merge(hoarder); assertEquals(1, hoarder.getItems().size()); assertSame(hoarder.getFavoriteItem(), hoarder.getItems().iterator().next()); assertEquals(item1.getId(), hoarder.getFavoriteItem().getId()); assertEquals(item1.getCategory(), hoarder.getFavoriteItem().getCategory()); tx.commit(); s.close(); s = openSession(); tx = s.beginTransaction(); hoarder = (Hoarder) s.merge(hoarder); assertEquals(1, hoarder.getItems().size()); assertSame(hoarder.getFavoriteItem(), hoarder.getItems().iterator().next()); assertEquals(item1.getId(), hoarder.getFavoriteItem().getId()); assertEquals(item1.getCategory(), hoarder.getFavoriteItem().getCategory()); tx.commit(); s.close(); cleanup(); }