Source code: org/hibernate/test/manytomany/ordered/OrderedManyToManyTest.java
1 package org.hibernate.test.manytomany.ordered;
2
3 import org.hibernate.test.TestCase;
4 import org.hibernate.Session;
5 import org.hibernate.Transaction;
6 import org.hibernate.Hibernate;
7 import org.hibernate.FetchMode;
8 import org.hibernate.Criteria;
9 import org.hibernate.cfg.Configuration;
10 import org.hibernate.cfg.Environment;
11 import junit.framework.Test;
12 import junit.framework.TestSuite;
13
14 import java.util.List;
15
16 /**
17 * @author Gavin King
18 */
19 public class OrderedManyToManyTest extends TestCase {
20
21 public OrderedManyToManyTest(String str) {
22 super(str);
23 }
24
25 public void testManyToManyOrdering() {
26 Session s = openSession();
27 Transaction t = s.beginTransaction();
28 User gavin = new User( "gavin", "jboss" );
29 User steve = new User( "steve", "jboss" );
30 User max = new User( "max", "jboss" );
31 User emmanuel = new User( "emmanuel", "jboss" );
32 s.persist( gavin );
33 s.persist( steve );
34 s.persist( max );
35 s.persist( emmanuel );
36 Group hibernate = new Group( "hibernate", "jboss" );
37 hibernate.addUser( gavin );
38 hibernate.addUser( steve );
39 hibernate.addUser( max );
40 hibernate.addUser( emmanuel );
41 s.persist( hibernate );
42 t.commit();
43 s.close();
44
45 // delayed collection load...
46 s = openSession();
47 t = s.beginTransaction();
48 hibernate = ( Group ) s.get( Group.class, hibernate.getId() );
49 assertFalse( Hibernate.isInitialized( hibernate.getUsers() ) );
50 assertEquals( 4, hibernate.getUsers().size() );
51 assertOrdering( hibernate.getUsers() );
52 t.commit();
53 s.close();
54
55 // HQL (non eager)
56 s = openSession();
57 t = s.beginTransaction();
58 hibernate = ( Group ) s.createQuery( "from Group" ).uniqueResult();
59 assertFalse( Hibernate.isInitialized( hibernate.getUsers() ) );
60 assertEquals( 4, hibernate.getUsers().size() );
61 assertOrdering( hibernate.getUsers() );
62 t.commit();
63 s.close();
64
65 // HQL (eager)
66 s = openSession();
67 t = s.beginTransaction();
68 hibernate = ( Group ) s.createQuery( "from Group g inner join fetch g.users" ).uniqueResult();
69 assertTrue( Hibernate.isInitialized( hibernate.getUsers() ) );
70 assertEquals( 4, hibernate.getUsers().size() );
71 assertOrdering( hibernate.getUsers() );
72 t.commit();
73 s.close();
74
75 // criteria load (forced eager fetch)
76 s = openSession();
77 t = s.beginTransaction();
78 Criteria criteria = s.createCriteria( Group.class );
79 criteria.setFetchMode( "users", FetchMode.JOIN );
80 hibernate = ( Group ) criteria.uniqueResult();
81 assertTrue( Hibernate.isInitialized( hibernate.getUsers() ) );
82 assertEquals( 4, hibernate.getUsers().size() );
83 assertOrdering( hibernate.getUsers() );
84 t.commit();
85 s.close();
86
87 // criteria load (forced non eager fetch)
88 s = openSession();
89 t = s.beginTransaction();
90 criteria = s.createCriteria( Group.class );
91 criteria.setFetchMode( "users", FetchMode.SELECT );
92 hibernate = ( Group ) criteria.uniqueResult();
93 assertFalse( Hibernate.isInitialized( hibernate.getUsers() ) );
94 assertEquals( 4, hibernate.getUsers().size() );
95 assertOrdering( hibernate.getUsers() );
96 t.commit();
97 s.close();
98
99 // clean up
100 s = openSession();
101 t = s.beginTransaction();
102 s.delete( gavin );
103 s.delete( steve );
104 s.delete( max );
105 s.delete( emmanuel );
106 s.delete( hibernate );
107 t.commit();
108 s.close();
109 }
110
111 private void assertOrdering(List users) {
112 User user = extractUser( users, 0 );
113 assertTrue( "many-to-many ordering not applied", user.getName().equals( "emmanuel" ) );
114 user = extractUser( users, 1 );
115 assertTrue( "many-to-many ordering not applied", user.getName().equals( "gavin" ) );
116 user = extractUser( users, 2 );
117 assertTrue( "many-to-many ordering not applied", user.getName().equals( "max" ) );
118 user = extractUser( users, 3 );
119 assertTrue( "many-to-many ordering not applied", user.getName().equals( "steve" ) );
120 }
121
122 private User extractUser(List users, int position) {
123 return ( User ) users.get( position );
124 }
125 protected String[] getMappings() {
126 return new String[] { "manytomany/ordered/UserGroup.hbm.xml" };
127 }
128
129 public static Test suite() {
130 return new TestSuite( OrderedManyToManyTest.class);
131 }
132
133 protected void configure(Configuration cfg) {
134 cfg.setProperty( Environment.USE_SECOND_LEVEL_CACHE, "false");
135 }
136
137 }