/*
* 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.embeddable;
import static org.fest.assertions.Assertions.assertThat;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.CollectionTable;
import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.EntityManager;
import javax.persistence.Id;
import javax.persistence.Table;
import org.hibernate.ogm.utils.TestForIssue;
import org.hibernate.ogm.utils.jpa.OgmJpaTestCase;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
/**
* @author Davide D'Alto
*/
@TestForIssue(jiraKey = "OGM-1238")
public class ElementCollectionOrderWithJpaTest extends OgmJpaTestCase {
private static final String ENTITY_ID = "Entity";
private static final String[] EVENTS = {
"event 5",
"event 3",
"event 1",
"event 2",
"event 4",
"event 14",
"event x"
};
@Before
public void before() {
EntityManager em = getFactory().createEntityManager();
try {
em.getTransaction().begin();
PlainEntity entity = new PlainEntity();
entity.id = ENTITY_ID;
for ( Object event : EVENTS ) {
entity.events.add( (String) event );
}
em.persist( entity );
em.getTransaction().commit();
}
finally {
em.close();
}
}
@After
public void after() {
EntityManager em = getFactory().createEntityManager();
try {
em.getTransaction().begin();
PlainEntity entity = em.find( PlainEntity.class, ENTITY_ID );
if ( entity != null ) {
em.remove( entity );
}
em.getTransaction().commit();
}
finally {
em.close();
}
}
@Test
public void testOrderWithFind() {
EntityManager em = getFactory().createEntityManager();
try {
em.getTransaction().begin();
PlainEntity entity = em.find( PlainEntity.class, ENTITY_ID );
assertThat( entity ).isNotNull();
assertThatCollectionIsCorrect( entity.events, EVENTS );
em.getTransaction().commit();
}
finally {
em.close();
}
}
@Test
public void testOrderWithGetReference() {
EntityManager em = getFactory().createEntityManager();
try {
em.getTransaction().begin();
PlainEntity entity = em.getReference( PlainEntity.class, ENTITY_ID );
assertThat( entity ).isNotNull();
assertThatCollectionIsCorrect( entity.events, EVENTS );
em.getTransaction().commit();
}
finally {
em.close();
}
}
@Test
public void testOrderWithQueryAndUniqueResult() {
EntityManager em = getFactory().createEntityManager();
try {
em.getTransaction().begin();
PlainEntity entity = (PlainEntity) em.createQuery( "from " + PlainEntity.class.getName() )
.getSingleResult();
assertThat( entity ).isNotNull();
assertThatCollectionIsCorrect( entity.events, EVENTS );
em.getTransaction().commit();
}
finally {
em.close();
}
}
@Test
public void testOrderWithQueryAndList() {
EntityManager em = getFactory().createEntityManager();
try {
em.getTransaction().begin();
PlainEntity entity = (PlainEntity) em.createQuery( "from " + PlainEntity.class.getName() )
.getResultList().get( 0 );
assertThat( entity ).isNotNull();
assertThatCollectionIsCorrect( entity.events, EVENTS );
em.getTransaction().commit();
}
finally {
em.close();
}
}
private void assertThatCollectionIsCorrect(List<String> actual, String[] expected) {
int i = 0;
for ( String entry : actual ) {
assertThat( entry ).isEqualTo( expected[i++] );
}
}
@Override
protected Class<?>[] getAnnotatedClasses() {
return new Class[]{ PlainEntity.class };
}
@Entity
@Table(name = "PlainEntity")
static class PlainEntity {
@Id
String id;
@ElementCollection
@CollectionTable(name = "events")
List<String> events = new ArrayList<>();
}
}