Package org.hibernate.ogm.test.persister

Source Code of org.hibernate.ogm.test.persister.BiDirectionalAssociationHelperTest

/*
* 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.test.persister;

import static org.fest.assertions.Assertions.assertThat;

import org.hibernate.ogm.backendtck.associations.collection.manytomany.AccountOwner;
import org.hibernate.ogm.backendtck.associations.collection.manytomany.BankAccount;
import org.hibernate.ogm.backendtck.associations.collection.unidirectional.Cloud;
import org.hibernate.ogm.backendtck.associations.collection.unidirectional.SnowFlake;
import org.hibernate.ogm.backendtck.associations.manytoone.SalesForce;
import org.hibernate.ogm.backendtck.associations.manytoone.SalesGuy;
import org.hibernate.ogm.backendtck.associations.onetoone.Husband;
import org.hibernate.ogm.backendtck.associations.onetoone.Wife;
import org.hibernate.ogm.model.key.spi.AssociationKeyMetadata;
import org.hibernate.ogm.persister.impl.BiDirectionalAssociationHelper;
import org.hibernate.ogm.persister.impl.OgmCollectionPersister;
import org.hibernate.ogm.persister.impl.OgmEntityPersister;
import org.hibernate.ogm.utils.OgmTestCase;
import org.junit.Test;

/**
* Test for {@link BiDirectionalAssociationHelper}.
*
* @author Gunnar Morling
*/
public class BiDirectionalAssociationHelperTest extends OgmTestCase {

  @Test
  public void inverseMetadataForUnidirectionalOneToManyShouldBeNull() {
    OgmCollectionPersister persister = (OgmCollectionPersister) sessions.getCollectionPersister( Cloud.class.getName() + ".producedSnowFlakes" );
    OgmCollectionPersister inversePersister = BiDirectionalAssociationHelper.getInverseCollectionPersister( persister );
    assertThat( inversePersister ).isNull();
  }

  @Test
  public void canObtainInverseMetadataForBiDirectionalManyToOne() {
    // obtain inverse collection from the main side
    OgmEntityPersister entityPersister = (OgmEntityPersister) sessions.getEntityPersister( SalesGuy.class.getName() );
    AssociationKeyMetadata inverseAssociationKeyMetadata = BiDirectionalAssociationHelper.getInverseAssociationKeyMetadata( entityPersister, entityPersister.getPropertyIndex( "salesForce" ) );
    assertThat( inverseAssociationKeyMetadata ).isNotNull();
    assertThat( inverseAssociationKeyMetadata.getTable() ).isEqualTo( "SalesGuy" );
    assertThat( inverseAssociationKeyMetadata.getColumnNames() ).isEqualTo( new String[]{ "salesForce_id" } );
    assertThat( inverseAssociationKeyMetadata.getRowKeyColumnNames() ).isEqualTo( new String[]{ "salesForce_id", "id" } );

    // no persister on the main side
    OgmCollectionPersister collectionPersister = (OgmCollectionPersister) sessions.getCollectionPersister( SalesForce.class.getName() + ".salesGuys" );
    OgmCollectionPersister mainSidePersister = BiDirectionalAssociationHelper.getInverseCollectionPersister( collectionPersister );
    assertThat( mainSidePersister ).isNull();
  }

  @Test
  public void canObtainInverseMetadataForBiDirectionalManyToMany() {
    // obtain inverse collection from the main side
    OgmEntityPersister entityPersister = (OgmEntityPersister) sessions.getEntityPersister( AccountOwner.class.getName() );
    AssociationKeyMetadata inverseAssociationKeyMetadata = BiDirectionalAssociationHelper.getInverseAssociationKeyMetadata( entityPersister, entityPersister.getPropertyIndex( "bankAccounts" ) );
    assertThat( inverseAssociationKeyMetadata ).isNotNull();
    assertThat( inverseAssociationKeyMetadata.getTable() ).isEqualTo( "AccountOwner_BankAccount" );
    assertThat( inverseAssociationKeyMetadata.getColumnNames() ).isEqualTo( new String[]{ "bankAccounts_id" } );
    assertThat( inverseAssociationKeyMetadata.getRowKeyColumnNames() ).isEqualTo( new String[]{ "bankAccounts_id", "owners_id" } );

    // obtain main side collection from the inverse side
    entityPersister = (OgmEntityPersister) sessions.getEntityPersister( BankAccount.class.getName() );
    AssociationKeyMetadata mainSideAssociationKeyMetadata = BiDirectionalAssociationHelper.getInverseAssociationKeyMetadata( entityPersister, entityPersister.getPropertyIndex( "owners" ) );
    assertThat( mainSideAssociationKeyMetadata ).isNotNull();
    assertThat( mainSideAssociationKeyMetadata.getTable() ).isEqualTo( "AccountOwner_BankAccount" );
    assertThat( mainSideAssociationKeyMetadata.getColumnNames() ).isEqualTo( new String[]{ "owners_id" } );
    assertThat( mainSideAssociationKeyMetadata.getRowKeyColumnNames() ).isEqualTo( new String[]{ "owners_id", "bankAccounts_id" } );
  }

  @Test
  public void canHandleSeveralAssociationsOnInverseSide() {
    // obtain inverse collection from the main side
    OgmEntityPersister entityPersister = (OgmEntityPersister) sessions.getEntityPersister( Pancake.class.getName() );
    AssociationKeyMetadata inverseAssociationKeyMetadata = BiDirectionalAssociationHelper.getInverseAssociationKeyMetadata( entityPersister, entityPersister.getPropertyIndex( "eater" ) );
    assertThat( inverseAssociationKeyMetadata ).isNotNull();
    assertThat( inverseAssociationKeyMetadata.getTable() ).isEqualTo( "Pancake" );
    assertThat( inverseAssociationKeyMetadata.getColumnNames() ).isEqualTo( new String[]{ "eater_id" } );
    assertThat( inverseAssociationKeyMetadata.getRowKeyColumnNames() ).isEqualTo( new String[]{ "eater_id", "id" } );

    // obtain inverse collection from the main side, different entity
    entityPersister = (OgmEntityPersister) sessions.getEntityPersister( Muffin.class.getName() );
    inverseAssociationKeyMetadata = BiDirectionalAssociationHelper.getInverseAssociationKeyMetadata( entityPersister, entityPersister.getPropertyIndex( "eater" ) );
    assertThat( inverseAssociationKeyMetadata ).isNotNull();
    assertThat( inverseAssociationKeyMetadata.getTable() ).isEqualTo( "Muffin" );
    assertThat( inverseAssociationKeyMetadata.getColumnNames() ).isEqualTo( new String[]{ "eater_id" } );
    assertThat( inverseAssociationKeyMetadata.getRowKeyColumnNames() ).isEqualTo( new String[]{ "eater_id", "id" } );
  }

  @Test
  public void canObtainInverseMetadataForBiDirectionalOneToOne() {
    // obtain inverse collection from the main side
    OgmEntityPersister entityPersister = (OgmEntityPersister) sessions.getEntityPersister( Husband.class.getName() );
    AssociationKeyMetadata inverseAssociationKeyMetadata = BiDirectionalAssociationHelper.getInverseAssociationKeyMetadata( entityPersister, entityPersister.getPropertyIndex( "wife" ) );
    assertThat( inverseAssociationKeyMetadata ).isNotNull();
    assertThat( inverseAssociationKeyMetadata.getTable() ).isEqualTo( "Husband" );
    assertThat( inverseAssociationKeyMetadata.getColumnNames() ).isEqualTo( new String[]{ "wife" } );
    assertThat( inverseAssociationKeyMetadata.getRowKeyColumnNames() ).isEqualTo( new String[]{ "id", "wife" } );
  }

  @Test
  public void canObtainMainSidePropertyNameForOneToMany() {
    OgmCollectionPersister persister = (OgmCollectionPersister) sessions.getCollectionPersister( SalesForce.class.getName() + ".salesGuys" );
    String mainSidePropertyName = BiDirectionalAssociationHelper.getMainSidePropertyName( persister );
    assertThat( mainSidePropertyName ).isEqualTo( "salesForce" );
  }

  @Test
  public void canObtainMainSidePropertyNameForManyToMany() {
    // ask from main side
    OgmCollectionPersister persister = (OgmCollectionPersister) sessions.getCollectionPersister( AccountOwner.class.getName() + ".bankAccounts" );
    String mainSidePropertyName = BiDirectionalAssociationHelper.getMainSidePropertyName( persister );
    assertThat( mainSidePropertyName ).isEqualTo( "bankAccounts" );

    // ask from inverse side
    persister = (OgmCollectionPersister) sessions.getCollectionPersister( BankAccount.class.getName() + ".owners" );
    mainSidePropertyName = BiDirectionalAssociationHelper.getMainSidePropertyName( persister );
    assertThat( mainSidePropertyName ).isEqualTo( "bankAccounts" );
  }

  @Test
  public void canObtainMainSidePropertyNameWithSeveralAssociationsOnInverseSide() {
    OgmCollectionPersister persister = (OgmCollectionPersister) sessions.getCollectionPersister( Eater.class.getName() + ".muffins" );
    String mainSidePropertyName = BiDirectionalAssociationHelper.getMainSidePropertyName( persister );
    assertThat( mainSidePropertyName ).isEqualTo( "eater" );

    persister = (OgmCollectionPersister) sessions.getCollectionPersister( Eater.class.getName() + ".muffinsEatenAsStandin" );
    mainSidePropertyName = BiDirectionalAssociationHelper.getMainSidePropertyName( persister );
    assertThat( mainSidePropertyName ).isEqualTo( "standinEater" );
  }

  @Override
  protected Class<?>[] getAnnotatedClasses() {
    return new Class<?>[] { Cloud.class, SnowFlake.class, SalesForce.class, SalesGuy.class, BankAccount.class, AccountOwner.class, Pancake.class,
        Muffin.class, Eater.class, Wife.class, Husband.class };
  }
}
TOP

Related Classes of org.hibernate.ogm.test.persister.BiDirectionalAssociationHelperTest

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.