/*
* 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.embeddable;
import static org.fest.assertions.Assertions.assertThat;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.ogm.utils.OgmTestCase;
import org.junit.Test;
/**
* Tests for {@code @Embeddable} types and {@code @ElementCollection}s there-of.
*
* @author Emmanuel Bernard
* @author Gunnar Morling
*/
public class EmbeddableTest extends OgmTestCase {
@Test
public void testEmbeddable() throws Exception {
final Session session = openSession();
Transaction transaction = session.beginTransaction();
Account account = new Account();
account.setLogin( "emmanuel" );
account.setPassword( "like I would tell ya" );
account.setHomeAddress( new Address() );
final Address address = account.getHomeAddress();
address.setCity( "Paris" );
address.setCountry( "France" );
address.setStreet1( "1 avenue des Champs Elysees" );
address.setZipCode( "75007" );
session.persist( account );
transaction.commit();
session.clear();
transaction = session.beginTransaction();
final Account loadedAccount = (Account) session.get( Account.class, account.getLogin() );
assertThat( loadedAccount ).as( "Cannot load persisted object" ).isNotNull();
final Address loadedAddress = loadedAccount.getHomeAddress();
assertThat( loadedAddress ).as( "Embeddable should not be null" ).isNotNull();
assertThat( loadedAddress.getCity() ).as( "persist and load fails for embeddable" ).isEqualTo( address.getCity() );
assertThat( loadedAddress.getZipCode() ).as( "@Column support for embeddable does not work" ).isEqualTo( address.getZipCode() );
transaction.commit();
session.clear();
transaction = session.beginTransaction();
loadedAddress.setCountry( "USA" );
session.merge( loadedAccount );
transaction.commit();
session.clear();
transaction = session.beginTransaction();
Account secondLoadedAccount = (Account) session.get( Account.class, account.getLogin() );
assertThat( loadedAccount.getHomeAddress().getCity() ).as( "Merge fails for embeddable" ).isEqualTo( secondLoadedAccount.getHomeAddress().getCity() );
session.delete( secondLoadedAccount );
transaction.commit();
session.clear();
transaction = session.beginTransaction();
assertThat( session.get( Account.class, account.getLogin() ) ).isNull();
transaction.commit();
session.close();
}
@Test
public void testNestedEmbeddable() {
final Session session = openSession();
// persist entity without the embeddables
Transaction transaction = session.beginTransaction();
Account account = new Account();
account.setLogin( "gunnar" );
session.persist( account );
transaction.commit();
session.clear();
// read back
transaction = session.beginTransaction();
Account loadedAccount = (Account) session.get( Account.class, account.getLogin() );
assertThat( loadedAccount ).as( "Cannot load persisted object with nested embeddables which are null" ).isNotNull();
assertThat( loadedAccount.getHomeAddress() ).isNull();
// update
loadedAccount.setHomeAddress( new Address() );
loadedAccount.getHomeAddress().setCity( "Lima" );
loadedAccount.getHomeAddress().setType( new AddressType( "primary" ) );
transaction.commit();
session.clear();
// read back nested embeddable
transaction = session.beginTransaction();
loadedAccount = (Account) session.get( Account.class, account.getLogin() );
assertThat( loadedAccount ).as( "Cannot load persisted object with nested embeddables" ).isNotNull();
assertThat( loadedAccount.getHomeAddress() ).isNotNull();
assertThat( loadedAccount.getHomeAddress().getCity() ).isEqualTo( "Lima" );
assertThat( loadedAccount.getHomeAddress().getType() ).isNotNull();
assertThat( loadedAccount.getHomeAddress().getType().getName() ).isEqualTo( "primary" );
session.delete( loadedAccount );
transaction.commit();
session.clear();
transaction = session.beginTransaction();
assertThat( session.get( Account.class, account.getLogin() ) ).isNull();
transaction.commit();
session.close();
}
@Test
public void testNestedEmbeddedWithNullProperties() {
final Session session = openSession();
// persist entity with the embeddables
Transaction transaction = session.beginTransaction();
Account account = new Account();
account.setLogin( "gunnar" );
account.setHomeAddress( new Address() );
account.getHomeAddress().setCity( "Lima" );
account.getHomeAddress().setType( new AddressType( "primary" ) );
session.persist( account );
transaction.commit();
session.clear();
// set nested embedded to null
transaction = session.beginTransaction();
Account loadedAccount = (Account) session.get( Account.class, account.getLogin() );
loadedAccount.getHomeAddress().setType( null );
transaction.commit();
session.clear();
// read back nested embedded and set regular embedded to null
transaction = session.beginTransaction();
loadedAccount = (Account) session.get( Account.class, account.getLogin() );
assertThat( loadedAccount ).as( "Cannot load persisted object with nested embeddables" ).isNotNull();
assertThat( loadedAccount.getHomeAddress() ).isNotNull();
assertThat( loadedAccount.getHomeAddress().getType() ).isNull();
loadedAccount.setHomeAddress( null );
transaction.commit();
session.clear();
// read back embedded
transaction = session.beginTransaction();
loadedAccount = (Account) session.get( Account.class, account.getLogin() );
assertThat( loadedAccount ).as( "Cannot load persisted object with nested embeddables" ).isNotNull();
assertThat( loadedAccount.getHomeAddress() ).isNull();
session.delete( loadedAccount );
transaction.commit();
session.clear();
transaction = session.beginTransaction();
assertThat( session.get( Account.class, account.getLogin() ) ).isNull();
transaction.commit();
session.close();
}
@Override
protected Class<?>[] getAnnotatedClasses() {
return new Class<?>[] { Account.class };
}
}