/*
* 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;
import org.junit.Test;
import org.hibernate.Transaction;
import org.hibernate.ogm.OgmSession;
import org.hibernate.ogm.backendtck.associations.collection.types.Race;
import org.hibernate.ogm.backendtck.associations.collection.types.Runner;
import org.hibernate.ogm.backendtck.associations.manytoone.Court;
import org.hibernate.ogm.backendtck.associations.manytoone.Game;
import org.hibernate.ogm.utils.OgmTestCase;
import static org.fest.assertions.Assertions.assertThat;
import static org.hibernate.ogm.datastore.mongodb.utils.MongoDBTestHelper.assertDocument;
/**
* @author Emmanuel Bernard <emmanuel@hibernate.org>
*/
public class AssociationCompositeKeyMongoDBFormatTest extends OgmTestCase {
@Test
public void testDefaultBiDirManyToOneCompositeKeyTest() throws Exception {
OgmSession session = openSession();
Transaction transaction = session.beginTransaction();
Court court = new Court();
court.setId( new Court.CourtId() );
court.getId().setCountryCode( "DE" );
court.getId().setSequenceNo( 123 );
court.setName( "Hamburg Court" );
session.persist( court );
Game game1 = new Game();
game1.setId( new Game.GameId() );
game1.getId().setCategory( "primary" );
game1.getId().setSequenceNo( 456 );
game1.setName( "The game" );
game1.setPlayedOn( court );
court.getGames().add( game1 );
Game game2 = new Game();
game2.setId( new Game.GameId() );
game2.getId().setCategory( "primary" );
game2.getId().setSequenceNo( 457 );
game2.setName( "The other game" );
game2.setPlayedOn( court );
session.persist( game1 );
session.persist( game2 );
session.flush();
transaction.commit();
session.clear();
transaction = session.beginTransaction();
assertDocument(
session.getSessionFactory(),
// collection
"Court",
// query
"{ '_id' : { 'countryCode': 'DE', 'sequenceNo': 123 } }",
// expected
"{ " +
"'_id' : { 'countryCode': 'DE', 'sequenceNo': 123 }, " +
"'games' : " +
"[ { 'gameSequenceNo': 456, 'category': 'primary' }, " +
" { 'gameSequenceNo': 457, 'category': 'primary' } ], " +
"'name': 'Hamburg Court' " +
"}"
);
assertDocument(
session.getSessionFactory(),
// collection
"Game",
// query
"{ '_id' : { 'category': 'primary', 'gameSequenceNo': 456 } }",
// expected
"{ " +
"'_id' : { 'category': 'primary', 'gameSequenceNo': 456 }, " +
"'playedOn_id' : { 'countryCode': 'DE', 'sequenceNo': 123 }, " +
"'name': 'The game' " +
"}"
);
Court localCourt = (Court) session.get( Court.class, new Court.CourtId( "DE", 123 ) );
assertThat( localCourt.getGames() ).hasSize( 2 );
for ( Game game : localCourt.getGames() ) {
session.delete( game );
}
localCourt.getGames().clear();
session.delete( localCourt );
transaction.commit();
session.close();
}
@Test
public void testOrderedListAndCompositeId() throws Exception {
OgmSession session = openSession();
Transaction transaction = session.beginTransaction();
Race race = new Race();
race.setRaceId( new Race.RaceId( 23, 75 ) );
Runner runner = new Runner();
runner.setAge( 37 );
runner.setRunnerId( new Runner.RunnerId( "Emmanuel", "Bernard" ) );
Runner runner2 = new Runner();
runner2.setAge( 105 );
runner2.setRunnerId( new Runner.RunnerId( "Pere", "Noel" ) );
race.getRunnersByArrival().add( runner );
race.getRunnersByArrival().add( runner2 );
session.persist( race );
session.persist( runner );
session.persist( runner2 );
transaction.commit();
session.clear();
transaction = session.beginTransaction();
assertDocument(
session.getSessionFactory(),
// collection
"Race",
// query
"{ '_id' : { 'federationDepartment' : 75, 'federationSequence' : 23 } }",
// expected
"{ '_id' : { 'federationDepartment' : 75, 'federationSequence' : 23 }, " +
"'runnersByArrival' : [ " +
"{ 'firstname' : 'Emmanuel', 'lastname' : 'Bernard', 'ranking' : 0 }, " +
"{ 'firstname' : 'Pere', 'lastname' : 'Noel', 'ranking' : 1 } " +
"] }"
);
race = (Race) session.get( Race.class, race.getRaceId() );
assertThat( race.getRunnersByArrival() ).hasSize( 2 );
assertThat( race.getRunnersByArrival().get( 0 ).getRunnerId().getFirstname() ).isEqualTo( "Emmanuel" );
session.delete( race.getRunnersByArrival().get( 0 ) );
session.delete( race.getRunnersByArrival().get( 1 ) );
session.delete( race );
transaction.commit();
session.close();
}
@Override
protected Class<?>[] getAnnotatedClasses() {
return new Class<?>[] { Game.class, Court.class, Race.class, Runner.class };
}
}