/* * Hibernate OGM, Domain model persistence for NoSQL datastores * * 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.ogm.datastore.mongodb.test.associations.ordercolumn; import static org.hibernate.ogm.datastore.mongodb.utils.MongoDBTestHelper.assertDocument; import org.hibernate.Transaction; import org.hibernate.ogm.OgmSession; import org.hibernate.ogm.utils.OgmTestCase; import org.junit.Test; /** * Test for the mapping of bi-directional associations with order columns. * * @author Gunnar Morling */ public class OrderColumnMappingTest extends OgmTestCase { @Test public void testOrderedBiDirectionalManyToOneMapping() throws Exception { OgmSession session = openSession(); Transaction tx = session.beginTransaction(); // Given TvShow bakingBread = new TvShow( "tvshow-1", "Baking Bread" ); Episode preparingTheDough = new Episode( "episode-1", "Preparing the Dough", bakingBread ); bakingBread.getEpisodes().add( preparingTheDough ); Episode heatingTheOven = new Episode( "episode-2", "Heating the Oven", bakingBread ); bakingBread.getEpisodes().add( heatingTheOven ); Episode bakingTheBread = new Episode( "episode-3", "Baking the Bread", bakingBread ); bakingBread.getEpisodes().add( bakingTheBread ); // When session.persist( bakingBread ); tx.commit(); session.clear(); tx = session.beginTransaction(); // Then assertDocument( session.getSessionFactory(), // collection "TvShow", // query "{ '_id' : 'tvshow-1' }", // expected "{" + "'_id' : 'tvshow-1', " + "'episodes' : [ " + "{ 'idx' : 2, 'id' : 'episode-3'} ," + "{ 'idx' : 1, 'id' : 'episode-2'} ," + "{ 'idx' : 0, 'id' : 'episode-1'}" + "]," + "'name' : 'Baking Bread'" + "}" ); assertDocument( session.getSessionFactory(), // collection "Episode", // query "{ '_id' : 'episode-1' }", // expected "{ " + "'_id' : 'episode-1', " + "'name' : 'Preparing the Dough'," + "'tv_show_id' : 'tvshow-1'" + "}" ); // Clean-Up bakingBread = (TvShow) session.get( TvShow.class, "tvshow-1" ); session.delete( bakingBread ); tx.commit(); session.close(); checkCleanCache(); } @Test public void testOrderedBiDirectionalManyToManyMapping() throws Exception { OgmSession session = openSession(); Transaction tx = session.beginTransaction(); // Given Episode preparingTheDough = new Episode( "episode-1", "Preparing the Dough", null ); Episode heatingTheOven = new Episode( "episode-2", "Heating the Oven", null ); Writer john = new Writer( "writer-1", "John" ); Writer pricilla = new Writer( "writer-2", "Pricilla" ); Writer ernst = new Writer( "writer-3", "Ernst" ); preparingTheDough.getAuthors().add( ernst ); ernst.getEpisodes().add( preparingTheDough ); preparingTheDough.getAuthors().add( john ); john.getEpisodes().add( preparingTheDough ); heatingTheOven.getAuthors().add( john ); john.getEpisodes().add( heatingTheOven ); // When session.persist( preparingTheDough ); session.persist( heatingTheOven ); session.persist( john ); session.persist( pricilla ); session.persist( ernst ); tx.commit(); session.clear(); tx = session.beginTransaction(); // Then assertDocument( session.getSessionFactory(), // collection "Writer", // query "{ '_id' : 'writer-1' }", // expected "{" + "'_id' : 'writer-1', " + "'episodes' : ['episode-1' , 'episode-2']," + "'name' : 'John'" + "}" ); assertDocument( session.getSessionFactory(), // collection "Writer", // query "{ '_id' : 'writer-3' }", // expected "{" + "'_id' : 'writer-3', " + "'episodes' : ['episode-1']," + "'name' : 'Ernst'" + "}" ); assertDocument( session.getSessionFactory(), // collection "Episode", // query "{ '_id' : 'episode-1' }", // expected "{ " + "'_id' : 'episode-1', " + "'authors' : [" + "{ 'authorOrder' : 1, 'authorId' : 'writer-1' }," + "{ 'authorOrder' : 0, 'authorId' : 'writer-3' }" + "]," + "'name' : 'Preparing the Dough'" + "}" ); // Clean-Up Writer writerToDelete = (Writer) session.get( Writer.class, "writer-1" ); session.delete( writerToDelete ); writerToDelete = (Writer) session.get( Writer.class, "writer-2" ); session.delete( writerToDelete ); writerToDelete = (Writer) session.get( Writer.class, "writer-3" ); session.delete( writerToDelete ); Episode episodeToDelete = (Episode) session.get( Episode.class, "episode-1" ); session.delete( episodeToDelete ); episodeToDelete = (Episode) session.get( Episode.class, "episode-2" ); session.delete( episodeToDelete ); tx.commit(); session.close(); checkCleanCache(); } @Override protected Class<?>[] getAnnotatedClasses() { return new Class<?>[] { TvShow.class, Episode.class, Writer.class }; } }