/* * Hibernate, Relational Persistence for Idiomatic Java * * License: GNU Lesser General Public License (LGPL), version 2.1 or later. * See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>. */ package org.hibernate.test.extralazy; import java.util.List; import java.util.Map; import org.hibernate.Hibernate; import org.hibernate.Session; import org.hibernate.Transaction; import org.hibernate.testing.DialectChecks; import org.hibernate.testing.FailureExpected; import org.hibernate.testing.RequiresDialectFeature; import org.hibernate.testing.TestForIssue; import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase; import org.junit.Test; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; /** * @author Gavin King */ public class ExtraLazyTest extends BaseCoreFunctionalTestCase { @Override public String[] getMappings() { return new String[] { "extralazy/UserGroup.hbm.xml","extralazy/Parent.hbm.xml","extralazy/Child.hbm.xml" }; } @Override protected Class<?>[] getAnnotatedClasses() { return new Class<?>[] { School.class, Student.class, Championship.class }; } @Test public void testOrphanDelete() { Session s = openSession(); Transaction t = s.beginTransaction(); User gavin = new User("gavin", "secret"); Document hia = new Document("HiA", "blah blah blah", gavin); Document hia2 = new Document("HiA2", "blah blah blah blah", gavin); s.persist(gavin); t.commit(); s.close(); s = openSession(); t = s.beginTransaction(); gavin = (User) s.get(User.class, "gavin"); assertEquals( 2, gavin.getDocuments().size() ); gavin.getDocuments().remove(hia2); assertFalse( gavin.getDocuments().contains(hia2) ); assertTrue( gavin.getDocuments().contains(hia) ); assertEquals( 1, gavin.getDocuments().size() ); assertFalse( Hibernate.isInitialized( gavin.getDocuments() ) ); t.commit(); s.close(); s = openSession(); t = s.beginTransaction(); gavin = (User) s.get(User.class, "gavin"); assertEquals( 1, gavin.getDocuments().size() ); assertFalse( gavin.getDocuments().contains(hia2) ); assertTrue( gavin.getDocuments().contains(hia) ); assertFalse( Hibernate.isInitialized( gavin.getDocuments() ) ); assertNull( s.get(Document.class, "HiA2") ); gavin.getDocuments().clear(); assertTrue( Hibernate.isInitialized( gavin.getDocuments() ) ); s.delete(gavin); t.commit(); s.close(); } @Test public void testGet() { Session s = openSession(); Transaction t = s.beginTransaction(); User gavin = new User("gavin", "secret"); User turin = new User("turin", "tiger"); Group g = new Group("developers"); g.getUsers().put("gavin", gavin); g.getUsers().put("turin", turin); s.persist(g); gavin.getSession().put( "foo", new SessionAttribute("foo", "foo bar baz") ); gavin.getSession().put( "bar", new SessionAttribute("bar", "foo bar baz 2") ); t.commit(); s.close(); s = openSession(); t = s.beginTransaction(); g = (Group) s.get(Group.class, "developers"); gavin = (User) g.getUsers().get("gavin"); turin = (User) g.getUsers().get("turin"); assertNotNull(gavin); assertNotNull(turin); assertNull( g.getUsers().get("emmanuel") ); assertFalse( Hibernate.isInitialized( g.getUsers() ) ); assertNotNull( gavin.getSession().get("foo") ); assertNull( turin.getSession().get("foo") ); assertFalse( Hibernate.isInitialized( gavin.getSession() ) ); assertFalse( Hibernate.isInitialized( turin.getSession() ) ); s.delete(gavin); s.delete(turin); s.delete(g); t.commit(); s.close(); } @Test public void testRemoveClear() { Session s = openSession(); Transaction t = s.beginTransaction(); User gavin = new User("gavin", "secret"); User turin = new User("turin", "tiger"); Group g = new Group("developers"); g.getUsers().put("gavin", gavin); g.getUsers().put("turin", turin); s.persist(g); gavin.getSession().put( "foo", new SessionAttribute("foo", "foo bar baz") ); gavin.getSession().put( "bar", new SessionAttribute("bar", "foo bar baz 2") ); t.commit(); s.close(); s = openSession(); t = s.beginTransaction(); g = (Group) s.get(Group.class, "developers"); gavin = (User) g.getUsers().get("gavin"); turin = (User) g.getUsers().get("turin"); assertFalse( Hibernate.isInitialized( g.getUsers() ) ); g.getUsers().clear(); gavin.getSession().remove("foo"); assertTrue( Hibernate.isInitialized( g.getUsers() ) ); assertTrue( Hibernate.isInitialized( gavin.getSession() ) ); t.commit(); s.close(); s = openSession(); t = s.beginTransaction(); g = (Group) s.get(Group.class, "developers"); assertTrue( g.getUsers().isEmpty() ); assertFalse( Hibernate.isInitialized( g.getUsers() ) ); gavin = (User) s.get(User.class, "gavin"); assertFalse( gavin.getSession().containsKey("foo") ); assertFalse( Hibernate.isInitialized( gavin.getSession() ) ); s.delete(gavin); s.delete(turin); s.delete(g); t.commit(); s.close(); } @Test public void testIndexFormulaMap() { Session s = openSession(); Transaction t = s.beginTransaction(); User gavin = new User("gavin", "secret"); User turin = new User("turin", "tiger"); Group g = new Group("developers"); g.getUsers().put("gavin", gavin); g.getUsers().put("turin", turin); s.persist(g); gavin.getSession().put( "foo", new SessionAttribute("foo", "foo bar baz") ); gavin.getSession().put( "bar", new SessionAttribute("bar", "foo bar baz 2") ); t.commit(); s.close(); s = openSession(); t = s.beginTransaction(); g = (Group) s.get(Group.class, "developers"); assertEquals( g.getUsers().size(), 2 ); g.getUsers().remove("turin"); Map smap = ( (User) g.getUsers().get("gavin") ).getSession(); assertEquals(smap.size(), 2); smap.remove("bar"); t.commit(); s.close(); s = openSession(); t = s.beginTransaction(); g = (Group) s.get(Group.class, "developers"); assertEquals( g.getUsers().size(), 1 ); smap = ( (User) g.getUsers().get("gavin") ).getSession(); assertEquals(smap.size(), 1); gavin = (User) g.getUsers().put("gavin", turin); s.delete(gavin); assertEquals( s.createQuery("select count(*) from SessionAttribute").uniqueResult(), new Long(0) ); t.commit(); s.close(); s = openSession(); t = s.beginTransaction(); g = (Group) s.get(Group.class, "developers"); assertEquals( g.getUsers().size(), 1 ); turin = (User) g.getUsers().get("turin"); smap = turin.getSession(); assertEquals(smap.size(), 0); assertEquals( s.createQuery("select count(*) from User").uniqueResult(), new Long(1) ); s.delete(g); s.delete(turin); assertEquals( s.createQuery("select count(*) from User").uniqueResult(), new Long(0) ); t.commit(); s.close(); } @Test @RequiresDialectFeature( DialectChecks.DoubleQuoteQuoting.class ) public void testSQLQuery() { Session s = openSession(); Transaction t = s.beginTransaction(); User gavin = new User("gavin", "secret"); User turin = new User("turin", "tiger"); gavin.getSession().put( "foo", new SessionAttribute("foo", "foo bar baz") ); gavin.getSession().put( "bar", new SessionAttribute("bar", "foo bar baz 2") ); s.persist(gavin); s.persist(turin); s.flush(); s.clear(); List results = s.getNamedQuery("userSessionData").setParameter("uname", "%in").list(); assertEquals( results.size(), 2 ); gavin = (User) ( (Object[]) results.get(0) )[0]; assertEquals( gavin.getName(), "gavin" ); assertEquals( gavin.getSession().size(), 2 ); s.createQuery("delete SessionAttribute").executeUpdate(); s.createQuery("delete User").executeUpdate(); t.commit(); s.close(); } @Test @TestForIssue(jiraKey="HHH-4294") public void testMap() { Session session1 = openSession(); Transaction tx1 = session1.beginTransaction(); Parent parent = new Parent (); Child child = new Child (); child.setFirstName("Ben"); parent.getChildren().put(child.getFirstName(), child); child.setParent(parent); session1.save(parent); tx1.commit(); session1.close(); // END PREPARE SECTION Session session2 = openSession(); Parent parent2 = (Parent)session2.get(Parent.class, parent.getId()); Child child2 = parent2.getChildren().get(child.getFirstName()); // causes SQLGrammarException because of wrong condition: where child0_.PARENT_ID=? and child0_.null=? assertNotNull(child2); session2.close(); } @Test @TestForIssue(jiraKey = "HHH-10874") public void testWhereClauseOnBidirectionalCollection() { Session s = openSession(); Transaction t = s.beginTransaction(); School school = new School(1); s.persist(school); Student gavin = new Student("gavin", 4); Student turin = new Student("turin", 3); Student mike = new Student("mike", 5); Student fred = new Student("fred", 2); gavin.setSchool(school); turin.setSchool(school); mike.setSchool(school); fred.setSchool(school); s.persist(gavin); s.persist(turin); s.persist(mike); s.persist(fred); t.commit(); s.close(); s = openSession(); School school2 = s.get(School.class, 1); assertEquals(4, school2.getStudents().size()); assertEquals( 2, school2.getTopStudents().size() ); assertTrue( school2.getTopStudents().contains( gavin ) ); assertTrue( school2.getTopStudents().contains( mike ) ); assertEquals(2, school2.getStudentsMap().size() ); assertTrue( school2.getStudentsMap().containsKey( gavin.getId() ) ); assertTrue( school2.getStudentsMap().containsKey( mike.getId() ) ); s.close(); } @Test @FailureExpected( jiraKey = "HHH-3319" ) public void testWhereClauseOnUnidirectionalCollection() { Session s = openSession(); Transaction t = s.beginTransaction(); Championship championship = new Championship( 1 ); s.persist(championship); Student gavin = new Student("gavin", 4); Student turin = new Student("turin", 3); Student mike = new Student("mike", 5); Student fred = new Student("fred", 2); championship.getStudents().add( gavin ); championship.getStudents().add( turin ); championship.getStudents().add( mike ); championship.getStudents().add( fred ); s.persist(gavin); s.persist(turin); s.persist(mike); s.persist(fred); t.commit(); s.close(); s = openSession(); Championship championship2 = s.get(Championship.class, 1); assertEquals( 2, championship2.getStudents().size() ); assertTrue( championship2.getStudents().contains( gavin ) ); assertTrue( championship2.getStudents().contains( mike ) ); s.close(); } @Override protected boolean rebuildSessionFactoryOnError() { return false; } }