/*
* 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.neo4j.test.mapping;
import static org.hibernate.ogm.datastore.neo4j.dialect.impl.NodeLabel.EMBEDDED;
import static org.hibernate.ogm.datastore.neo4j.dialect.impl.NodeLabel.ENTITY;
import static org.hibernate.ogm.datastore.neo4j.test.dsl.GraphAssertions.node;
import javax.persistence.EntityManager;
import org.hibernate.ogm.backendtck.embeddable.Address;
import org.hibernate.ogm.backendtck.embeddable.MultiAddressAccount;
import org.hibernate.ogm.datastore.neo4j.test.dsl.NodeForGraphAssertions;
import org.hibernate.ogm.datastore.neo4j.test.dsl.RelationshipsChainForGraphAssertions;
import org.junit.Before;
import org.junit.Test;
/**
* @author Davide D'Alto
*/
public class CollectionOfEmbeddableTest extends Neo4jJpaTestCase {
private Address address;
private Address anotherAddress;
private MultiAddressAccount account;
@Before
public void prepareDB() throws Exception {
EntityManager em = getFactory().createEntityManager();
em.getTransaction().begin();
address = new Address();
address.setCity( "Paris" );
address.setCountry( "France" );
address.setStreet1( "1 avenue des Champs Elysees" );
address.setZipCode( "75007" );
anotherAddress = new Address();
anotherAddress.setCity( "Rome" );
anotherAddress.setCountry( "Italy" );
anotherAddress.setStreet1( "Piazza del Colosseo, 1" );
anotherAddress.setZipCode( "00184" );
account = new MultiAddressAccount();
account.setLogin( "gunnar" );
account.setPassword( "highly secret" );
account.getAddresses().add( address );
account.getAddresses().add( anotherAddress );
em.persist( account );
em.getTransaction().commit();
em.close();
}
@Test
public void testMapping() throws Exception {
NodeForGraphAssertions accountNode = node( "account", MultiAddressAccount.class.getSimpleName(), ENTITY.name() )
.property( "login", account.getLogin() )
.property( "password", account.getPassword() );
NodeForGraphAssertions addressNode = node( "address", "MultiAddressAccount_addresses", EMBEDDED.name() )
.property( "city", address.getCity() )
.property( "country", address.getCountry() )
.property( "street1", address.getStreet1() )
.property( "postal_code", address.getZipCode() );
NodeForGraphAssertions anotherNode = node( "another", "MultiAddressAccount_addresses", EMBEDDED.name() )
.property( "city", anotherAddress.getCity() )
.property( "country", anotherAddress.getCountry() )
.property( "street1", anotherAddress.getStreet1() )
.property( "postal_code", anotherAddress.getZipCode() );
RelationshipsChainForGraphAssertions relationship1 = accountNode.relationshipTo( addressNode, "addresses" );
RelationshipsChainForGraphAssertions relationship2 = accountNode.relationshipTo( anotherNode, "addresses" );
assertThatOnlyTheseNodesExist( accountNode, addressNode, anotherNode );
assertThatOnlyTheseRelationshipsExist( relationship1, relationship2 );
}
@Test
public void testNoNodeIsLeftBehindWhenDeletingRelationships() throws Exception {
EntityManager em = getFactory().createEntityManager();
em.getTransaction().begin();
MultiAddressAccount multiAddressAccount = em.find( MultiAddressAccount.class, account.getLogin() );
multiAddressAccount.getAddresses().clear();
em.getTransaction().commit();
em.close();
NodeForGraphAssertions accountNode = node( "account", MultiAddressAccount.class.getSimpleName(), ENTITY.name() )
.property( "login", account.getLogin() )
.property( "password", account.getPassword() );
assertThatOnlyTheseNodesExist( accountNode );
assertNumberOfRelationships( 0 );
}
@Override
public Class<?>[] getAnnotatedClasses() {
return new Class[] { MultiAddressAccount.class, Address.class };
}
}