/* * 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.backendtck.associations.compositeid; import static org.fest.assertions.Assertions.assertThat; import org.hibernate.Session; import org.hibernate.Transaction; import org.hibernate.ogm.utils.GridDialectType; import org.hibernate.ogm.utils.OgmTestCase; import org.hibernate.ogm.utils.SkipByGridDialect; import org.junit.Test; /** * Tests for using composite keys in associations. * * @author Gunnar Morling */ @SkipByGridDialect( value = { GridDialectType.INFINISPAN_REMOTE }, comment = "Director.Tournament list - bag semantics unsupported (no primary key)" ) public class ReferencedCompositeIdTest extends OgmTestCase { @Test public void testManyToOneReferenceWithCompositeId() throws Exception { final Session session = openSession(); Transaction transaction = session.beginTransaction(); Tournament britishOpen = new Tournament( new TournamentId( "US", "123" ), "British Open" ); Tournament playersChampionship = new Tournament( new TournamentId( "US", "456" ), "Player's Championship" ); session.persist( britishOpen ); session.persist( playersChampionship ); // persist object with association Director bob = new Director( "bob", "Bob", playersChampionship ); session.persist( bob ); transaction.commit(); session.clear(); // assert and un-set the association transaction = session.beginTransaction(); Director loadedParticipant = (Director) session.get( Director.class, "bob" ); assertThat( bob.getDirectedTournament().getName() ).isEqualTo( "Player's Championship" ); bob.setDirectedTournament( null ); transaction.commit(); session.clear(); // association should have been removed transaction = session.beginTransaction(); loadedParticipant = (Director) session.get( Director.class, "bob" ); assertThat( bob.getDirectedTournament() ).isNull(); transaction.commit(); session.clear(); transaction = session.beginTransaction(); loadedParticipant = (Director) session.get( Director.class, "bob" ); session.delete( loadedParticipant.getDirectedTournament() ); session.delete( loadedParticipant ); session.delete( session.get( Tournament.class, britishOpen.getId() ) ); transaction.commit(); } @Test public void testManyToManyReferenceWithCompositeId() throws Exception { final Session session = openSession(); Transaction transaction = session.beginTransaction(); Tournament britishOpen = new Tournament( new TournamentId( "US", "123" ), "British Open" ); Tournament playersChampionship = new Tournament( new TournamentId( "US", "456" ), "Player's Championship" ); session.persist( britishOpen ); session.persist( playersChampionship ); // persist object with association Director bob = new Director( "bob", "Bob", null ); bob.getAttendedTournaments().add( britishOpen ); bob.getAttendedTournaments().add( playersChampionship ); session.persist( bob ); transaction.commit(); session.clear(); // assert association, remove one element transaction = session.beginTransaction(); Director loadedParticipant = (Director) session.get( Director.class, "bob" ); assertThat( bob.getAttendedTournaments() ).onProperty( "name" ).contains( "British Open", "Player's Championship" ); loadedParticipant.getAttendedTournaments().remove( session.get( Tournament.class, britishOpen.getId() ) ); transaction.commit(); session.clear(); // element should have been removed transaction = session.beginTransaction(); loadedParticipant = (Director) session.get( Director.class, "bob" ); assertThat( bob.getAttendedTournaments() ).onProperty( "name" ).contains( "Player's Championship" ); transaction.commit(); session.clear(); transaction = session.beginTransaction(); loadedParticipant = (Director) session.get( Director.class, "bob" ); session.delete( loadedParticipant ); session.delete( session.get( Tournament.class, britishOpen.getId() ) ); session.delete( session.get( Tournament.class, playersChampionship.getId() ) ); transaction.commit(); } @Override protected Class<?>[] getAnnotatedClasses() { return new Class<?>[] { Director.class, Tournament.class, TournamentId.class }; } }