View Javadoc
1   package ejava.examples.orm.rel;
2   
3   import static org.junit.Assert.*;
4   
5   import java.util.Collection;
6   
7   import org.junit.Test;
8   
9   import ejava.examples.orm.rel.annotated.Inventory;
10  import ejava.examples.orm.rel.annotated.Media;
11  
12  /**
13   * This test case provides a demo of a OneToMany relationship using a Join
14   * (or Link) table. In this relationship, the foreign keys are in a table
15   * separate from the two related items.
16   */
17  //TODO: resolve some confusion -- Media and Inventory are being used without a link table in the notes???
18  public class OneToManyJoinTableTest extends DemoBase {
19      
20      @Test
21      public void testOneToManyJoinCreate() {
22          logger.info("testLinkCreate");
23          ejava.examples.orm.rel.annotated.Inventory inventory
24              = new Inventory();
25          inventory.setName("testLinkCreate");
26          
27          em.persist(inventory);
28          
29          for(int i=0; i<5; i++) {
30              ejava.examples.orm.rel.annotated.Media media = new Media();
31              em.persist(media);
32              logger.info("created media:" + media);
33              inventory.getMedia().add(media);
34          }
35          em.flush();
36          logger.info("created inventory:{}", inventory);
37      }
38      
39      @Test
40      public void testOneToManyJoinFind() {
41          logger.info("testOneToManyJoinFind()");
42          
43          ejava.examples.orm.rel.annotated.Inventory inventory1
44              = new Inventory();
45          inventory1.setName("testLinkFind");
46          
47          em.persist(inventory1);
48          
49          for(int i=0; i<5; i++) {
50              ejava.examples.orm.rel.annotated.Media media = new Media();
51              //em.persist(media);
52              logger.info("created media:" + media);
53              inventory1.getMedia().add(media);
54          }
55          logger.info("creating inventory:{}", inventory1);
56  
57          em.flush();        
58          em.clear();
59          em.getTransaction().commit();
60          em.getTransaction().begin();
61  
62          assertFalse("inventory still managed", em.contains(inventory1));
63          
64          Inventory inventory2 = em.find(Inventory.class, inventory1.getId());
65          logger.info("found inventory:{}", inventory2);
66          
67          assertNotNull("inventory not found", inventory2);
68          assertNotSame(inventory1, inventory2);
69          assertTrue("inventory name unexpected:" + inventory2.getName(), 
70                  inventory1.getName().equals(inventory2.getName()));
71          assertNotNull("media null", inventory2.getMedia());
72          assertEquals("unexpected media count:" + inventory2.getMedia().size(), 
73                  inventory1.getMedia().size(), inventory2.getMedia().size());
74          findMedia(inventory2.getMedia(), true);
75      }
76  
77      @Test
78      public void testOneToManyJoinRemove() {
79          logger.info("testOneToManyJoinRemove");
80          ejava.examples.orm.rel.annotated.Inventory inventory1
81              = new Inventory();
82          inventory1.setName("testRemove");
83          
84          em.persist(inventory1);
85          
86          for(int i=0; i<5; i++) {
87              ejava.examples.orm.rel.annotated.Media media = new Media();
88              em.persist(media);
89              logger.info("created media:{}", media);
90              inventory1.getMedia().add(media);
91          }
92          logger.info("creating inventory:{}", inventory1);
93      
94          em.flush();        
95          em.clear();
96          em.getTransaction().commit();
97          em.getTransaction().begin();
98          
99          assertFalse("inventory still managed", em.contains(inventory1));
100         Inventory inventory2 = em.find(Inventory.class, inventory1.getId()); 
101         assertNotNull("inventory not found", inventory2);
102         findMedia(inventory2.getMedia(), true);
103         em.remove(inventory2);
104         logger.info("removed inventory:{}", inventory2);
105         assertTrue("inventory not removed",
106             em.createQuery("select object(i) from Inventory as i where i.id=" + 
107                     inventory2.getId()).getResultList().size() == 0);
108         //the media will also be deleted because of cascade=All
109         findMedia(inventory2.getMedia(), false);
110         
111    }
112     
113     private void findMedia(Collection<Media> media, boolean exist) {
114         logger.info("looking for media objects:{}", media.size());
115         for(Media m : media) {
116             if (exist) {
117                 assertTrue("media not found:" + m.getId(), 
118                     em.find(Media.class, m.getId()) != null);
119                 logger.info("found media:{}", m.getId());
120             }
121             else {
122                 assertFalse("media not found:" + m.getId(), 
123                         em.find(Media.class, m.getId()) != null);
124                     logger.info("media not found:{}", m.getId());            
125             }
126         }
127     }
128 }