org.firebrandocm.tests.PersistenceOperationTest.java Source code

Java tutorial

Introduction

Here is the source code for org.firebrandocm.tests.PersistenceOperationTest.java

Source

/*
 * Copyright (C) 2012 47 Degrees, LLC
 * http://47deg.com
 * hello@47deg.com
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.firebrandocm.tests;

import org.apache.commons.beanutils.PropertyUtils;
import org.firebrandocm.dao.ClassMetadata;
import org.firebrandocm.dao.Query;
import org.firebrandocm.dao.cql.clauses.Predicate;
import org.junit.BeforeClass;
import org.junit.Test;

import java.io.UnsupportedEncodingException;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.util.*;

import static junit.framework.Assert.*;
import static junit.framework.Assert.assertEquals;
import static org.firebrandocm.dao.cql.QueryBuilder.*;
import static org.firebrandocm.dao.cql.QueryBuilder.from;

/**
 *
 */
public class PersistenceOperationTest extends HectorAbstractTestCase {

    @BeforeClass
    public static void init() throws Exception {
        //initWithClasses(FirstEntity.class, SecondEntity.class, FirstEntityCounter.class);
        initWithClasses("org.firebrandocm.tests");
    }

    /**
     *
     * @return a random string on every call
     */
    private static String rds() {
        return UUID.randomUUID().toString();
    }

    @Test
    public void testAutoGeneratedId() {
        FirstEntity entity = factory.getInstance(FirstEntity.class);
        factory.persist(entity);
        assertNotNull(entity.getId());
    }

    @Test
    public void testCount() {
        long amount = 5L;
        for (int i = 0; i < amount; i++) {
            FirstEntity entity = factory.getInstance(FirstEntity.class);
            factory.persist(entity);
        }
        long count = factory.getSingleResult(Long.class, Query.get(select(count(), from(FirstEntity.class))));
        assertEquals(count, amount);
    }

    @Test
    public void testOrder() {
        int amount = 10;
        List<FirstEntity> creationOrderedEntities = new ArrayList<FirstEntity>(amount);
        for (int i = 0; i < amount; i++) {
            FirstEntity entity = factory.getInstance(FirstEntity.class);
            factory.persist(entity);
            creationOrderedEntities.add(entity);
        }
        List<FirstEntity> allEntities = factory.getResultList(FirstEntity.class,
                Query.get(select(allColumns(), from(FirstEntity.class))));

        assertEquals(amount, creationOrderedEntities.size());
        assertEquals(amount, allEntities.size());
        for (int i = 0; i < amount; i++) {
            FirstEntity entity = creationOrderedEntities.get(i);
            FirstEntity other = allEntities.get(i);
            assertEquals(entity, other);
        }
    }

    @Test
    public void testMappedEntity() {
        SecondEntity secondEntity = factory.getInstance(SecondEntity.class);
        factory.persist(secondEntity);
        FirstEntity entity = factory.getInstance(FirstEntity.class);
        entity.setMappedEntity(secondEntity);
        factory.persist(entity);
        assertNotNull(entity.getId());
        assertNotNull(secondEntity.getId());
        FirstEntity loadedEntity = factory.get(FirstEntity.class, entity.getId());
        assertEquals(secondEntity, loadedEntity.getMappedEntity());
        assertEquals(secondEntity.getId(), loadedEntity.getMappedEntity().getId());
    }

    @Test
    public void testMappedRecursiveEntity() {
        FirstEntity firstEntity = factory.getInstance(FirstEntity.class);
        SecondEntity secondEntity = factory.getInstance(SecondEntity.class);
        factory.persist(firstEntity);
        factory.persist(secondEntity);
        firstEntity.setMappedEntity(secondEntity);
        secondEntity.setMappedFirstEntity(firstEntity);
        factory.persist(firstEntity);
        factory.persist(secondEntity);
        assertEquals(firstEntity, secondEntity.getMappedFirstEntity());
        assertEquals(secondEntity, firstEntity.getMappedEntity());
    }

    @Test
    public void testMappedCollection() {
        int amount = 5;
        FirstEntity entity = factory.getInstance(FirstEntity.class);
        List<SecondEntity> listProperty = new ArrayList<SecondEntity>();
        for (int i = 0; i < amount; i++) {
            SecondEntity secondEntity = factory.getInstance(SecondEntity.class);
            factory.persist(secondEntity);
            listProperty.add(secondEntity);
        }
        entity.setListProperty(listProperty);
        factory.persist(entity);
        FirstEntity loadedEntity = factory.get(FirstEntity.class, entity.getId());
        assertNotNull("null list loaded but expected not null", loadedEntity.getListProperty());
        assertEquals(amount, loadedEntity.getListProperty().size());
        //test loaded equals and order
        for (int i = 0; i < amount; i++) {
            assertEquals(entity.getListProperty().get(i), loadedEntity.getListProperty().get(i));
        }
    }

    @Test
    public void testEnumProperty() {
        FirstEntity firstEntity = factory.getInstance(FirstEntity.class);
        firstEntity.setTestEnum(TestEnum.A);
        factory.persist(firstEntity);
        FirstEntity loadedEntity = factory.get(FirstEntity.class, firstEntity.getId());
        assertEquals(TestEnum.A, loadedEntity.getTestEnum());
    }

    @Test
    public void testEmbeddedEntity() {
        OtherEntity otherEntity = new OtherEntity();
        otherEntity.setFirstProperty(rds());
        otherEntity.setNullProperty(null);
        FirstEntity entity = factory.getInstance(FirstEntity.class);
        entity.setOtherEntity(otherEntity);
        factory.persist(entity);
        FirstEntity loadedEntity = factory.get(FirstEntity.class, entity.getId());
        assertEquals(otherEntity, loadedEntity.getOtherEntity());
        assertNull(loadedEntity.getOtherEntity().getNullProperty());
        assertNull(otherEntity.getNullProperty());
    }

    @Test
    public void testNestedEmbeddedEntity() {
        OtherEntity otherEntity = new OtherEntity();
        otherEntity.setFirstProperty(rds());
        otherEntity.setNullProperty(null);
        ThirdEntity thirdEntity = new ThirdEntity();
        thirdEntity.setSomeProperty(rds());
        otherEntity.setNestedThirdProperty(thirdEntity);
        FirstEntity entity = factory.getInstance(FirstEntity.class);
        entity.setOtherEntity(otherEntity);
        factory.persist(entity);
        FirstEntity loadedEntity = factory.get(FirstEntity.class, entity.getId());
        assertEquals(otherEntity, loadedEntity.getOtherEntity());
        assertEquals(thirdEntity, loadedEntity.getOtherEntity().getNestedThirdProperty());
        assertEquals(thirdEntity.getSomeProperty(),
                loadedEntity.getOtherEntity().getNestedThirdProperty().getSomeProperty());
    }

    @Test
    public void testCounterIncrease() {
        long counterInitialValue = 10;
        long counterIncreaseValue = +2;
        long afterPersistCounterExpectedValue = +2;
        long afterPersistCounterIncreaseExpectedValue = 0;
        FirstEntityCounter entity = new FirstEntityCounter();
        entity.setCounterProperty(counterInitialValue);
        entity.setCounterPropertyIncreaseBy(counterIncreaseValue);
        factory.persist(entity);
        assertEquals(afterPersistCounterIncreaseExpectedValue, entity.getCounterPropertyIncreaseBy());
        FirstEntityCounter loadedEntity = factory.get(entity.getClass(), entity.getId());
        assertEquals(afterPersistCounterExpectedValue, loadedEntity.getCounterProperty());
        assertEquals(afterPersistCounterIncreaseExpectedValue, loadedEntity.getCounterPropertyIncreaseBy());
    }

    @Test
    public void testSerializedObjectColumn() {
        FirstEntity entity = new FirstEntity();
        List<Object> list = Arrays.<Object>asList("1", 2, 3.0, 4L);
        entity.setListSerializedAsBytes(new LinkedList<Object>(list));
        factory.persist(entity);
        FirstEntity loadedEntity = factory.get(FirstEntity.class, entity.getId());
        assertEquals(entity.getListSerializedAsBytes(), loadedEntity.getListSerializedAsBytes());
    }

    @Test
    public void testColumnEagerAccess()
            throws NoSuchFieldException, IllegalAccessException, InvocationTargetException, NoSuchMethodException {
        FirstEntity firstEntity = new FirstEntity();
        firstEntity.setDescription(rds());
        factory.persist(firstEntity);
        testPropertyEagerAccess(FirstEntity.class, firstEntity.getId(), "description");
    }

    @Test
    public void testMappedEntityEagerAccess()
            throws NoSuchFieldException, IllegalAccessException, InvocationTargetException, NoSuchMethodException {
        FirstEntity firstEntity = new FirstEntity();
        SecondEntity secondEntity = new SecondEntity();
        factory.persist(secondEntity);
        firstEntity.setMappedEntity(secondEntity);
        factory.persist(firstEntity);
        testPropertyEagerAccess(FirstEntity.class, firstEntity.getId(), "mappedEntity");
    }

    @Test
    public void testMappedCollectionEagerAccess()
            throws NoSuchFieldException, IllegalAccessException, InvocationTargetException, NoSuchMethodException {
        FirstEntity firstEntity = new FirstEntity();
        List<SecondEntity> listProperty = new ArrayList<SecondEntity>();
        SecondEntity secondEntity = new SecondEntity();
        factory.persist(secondEntity);
        listProperty.add(secondEntity);
        firstEntity.setSecondEagerListProperty(listProperty);
        factory.persist(firstEntity);
        testPropertyEagerAccess(FirstEntity.class, firstEntity.getId(), "secondEagerListProperty");
    }

    @Test
    public void testColumnLazyAccess()
            throws NoSuchFieldException, IllegalAccessException, InvocationTargetException, NoSuchMethodException {
        FirstEntity firstEntity = new FirstEntity();
        firstEntity.setHugeDescription(rds());
        factory.persist(firstEntity);
        testPropertyLazyAccess(FirstEntity.class, firstEntity.getId(), "hugeDescription");
    }

    @Test
    public void testMappedEntityLazyAccess()
            throws NoSuchFieldException, IllegalAccessException, InvocationTargetException, NoSuchMethodException {
        FirstEntity firstEntity = new FirstEntity();
        SecondEntity secondEntity = new SecondEntity();
        factory.persist(secondEntity);
        firstEntity.setSecondLazyMappedEntity(secondEntity);
        factory.persist(firstEntity);
        testPropertyLazyAccess(FirstEntity.class, firstEntity.getId(), "secondLazyMappedEntity");
    }

    @Test
    public void testMappedCollectionLazyAccess()
            throws NoSuchFieldException, IllegalAccessException, InvocationTargetException, NoSuchMethodException {
        FirstEntity firstEntity = new FirstEntity();
        List<SecondEntity> listProperty = new ArrayList<SecondEntity>();
        SecondEntity secondEntity = new SecondEntity();
        factory.persist(secondEntity);
        listProperty.add(secondEntity);
        firstEntity.setListProperty(listProperty);
        factory.persist(firstEntity);
        testPropertyLazyAccess(FirstEntity.class, firstEntity.getId(), "listProperty");
    }

    @Test
    public void testEQByteArrayProperties() throws NoSuchFieldException, IllegalAccessException,
            InvocationTargetException, NoSuchMethodException, UnsupportedEncodingException {
        String test = UUID.randomUUID().toString();
        FirstEntity firstEntity = new FirstEntity();
        firstEntity.setSomeBytes(test.getBytes());
        factory.persist(firstEntity);
        FirstEntity loadedEntity = factory.get(FirstEntity.class, firstEntity.getId());
        assertEquals(new String(loadedEntity.getSomeBytes(), "UTF-8"), test);
    }

    @Test
    public void testEQLongIndexedProperty()
            throws InvocationTargetException, NoSuchMethodException, IllegalAccessException {
        testIndexedPropertyEQ(FirstEntity.class, new HashMap<String, Object>() {
            {
                put("phone", 123412341234L);
            }
        });
    }

    @Test
    public void testEQStringIndexedProperty()
            throws InvocationTargetException, NoSuchMethodException, IllegalAccessException {
        testIndexedPropertyEQ(FirstEntity.class, new HashMap<String, Object>() {
            {
                put("name", rds());
                put("description", "description'quoted");
            }
        });
    }

    @Test
    public void testEQDoubleIndexedProperty()
            throws InvocationTargetException, NoSuchMethodException, IllegalAccessException {
        testIndexedPropertyEQ(FirstEntity.class, new HashMap<String, Object>() {
            {
                put("score", 76.98);
            }
        });
    }

    @Test
    public void testRangeLongIndexedProperty()
            throws InvocationTargetException, NoSuchMethodException, IllegalAccessException {
        testIndexedPropertyRanges(FirstEntity.class, "phone", 1L, 0L, 2L);
    }

    @Test
    public void testRangeStringIndexedProperty()
            throws InvocationTargetException, NoSuchMethodException, IllegalAccessException {
        testIndexedPropertyRanges(FirstEntity.class, "name", "b", "a", "z");
    }

    @Test
    public void testRangeDoubleIndexedProperty()
            throws InvocationTargetException, NoSuchMethodException, IllegalAccessException {
        testIndexedPropertyRanges(FirstEntity.class, "score", 1.0, 0.0, 2.0);
    }

    @Test
    public void testRangeDateIndexedProperty()
            throws InvocationTargetException, NoSuchMethodException, IllegalAccessException {
        Date date = new Date();
        testIndexedPropertyRanges(FirstEntity.class, "date", date, new Date(date.getTime() - 1000),
                new Date(date.getTime() + 1000));
    }

    @Test
    public void testNamedQuery() {
        assertNotNull(ClassMetadata.getNullSafeNamedQuery(FirstEntity.QUERY_ALL_ENTITIES));
        FirstEntity firstEntity = new FirstEntity();
        factory.persist(firstEntity);
        FirstEntity loadedEntity = factory.getSingleResult(FirstEntity.class,
                Query.get(FirstEntity.QUERY_ALL_ENTITIES));
        assertEquals(loadedEntity, firstEntity);
    }

    @Test
    public void testNamedQueryWithParams() {
        assertNotNull(ClassMetadata.getNullSafeNamedQuery(FirstEntity.QUERY_ALL_ENTITIES_WITH_PARAMS));
        final FirstEntity firstEntity = new FirstEntity();
        factory.persist(firstEntity);
        FirstEntity loadedEntity = factory.getSingleResult(FirstEntity.class,
                Query.get(FirstEntity.QUERY_ALL_ENTITIES_WITH_PARAMS, new HashMap<String, Object>() {
                    {
                        put("key", firstEntity.getId());
                    }
                }));
        assertEquals(loadedEntity, firstEntity);
    }

    @Test
    public void testPrePersistListener() {
        final FirstEntity firstEntity = new FirstEntity();
        factory.persist(firstEntity);
        assertNotNull(firstEntity.getPrePersistProperty());
    }

    @Test
    public void testDeletion() {
        FirstEntity firstEntity = new FirstEntity();
        firstEntity.setName(rds());
        factory.persist(firstEntity);
        List<?> results = factory.getResultList(FirstEntity.class,
                Query.get(select(allColumns(), from(FirstEntity.class))));
        assertEquals(1, results.size());
        factory.remove(firstEntity);
        results = factory.getResultList(FirstEntity.class,
                Query.get(select(allColumns(), from(FirstEntity.class))));
        assertEquals(0, results.size());
    }

    @Test
    public void testMappedCounter() {
        FirstEntity entity = new FirstEntity();
        entity.setName(rds());
        factory.persist(entity);
        FirstEntityCounter counter = new FirstEntityCounter();
        factory.persist(counter);
        SecondEntity secondEntity = new SecondEntity();
        factory.persist(secondEntity);
        entity.setCounter(counter);
        entity.setMappedEntity(secondEntity);
        factory.persist(entity);
        FirstEntity loadedEntity = factory.get(FirstEntity.class, entity.getId());
        assertNotNull(loadedEntity.getCounter());
        assertEquals(counter, loadedEntity.getCounter());
        assertEquals(entity.getCounter(), loadedEntity.getCounter());
    }

    @Test
    public void testPagination() {
        //todo implement composite types once supported in CQL in 1.1 for pagination and ordering support via column composite names and wide rows.
        int amount = 10;
        int start = 2;
        int limit = 5;
        String startKey = null;
        String endKey = null;
        List<String> allKeys = new ArrayList<String>(amount);
        for (int i = 0; i < amount; i++) {
            FirstEntity entity = new FirstEntity();
            factory.persist(entity);
            if (i == start) {
                startKey = entity.getId();
            }

            if (i == start + limit - 1) {
                endKey = entity.getId();
            }
            allKeys.add(entity.getId());
        }
        Query query = Query
                .get(select(allColumns(), from(FirstEntity.class), where(range(startKey, endKey)), limit(limit)));
        log.debug(query.getQuery());
        List<FirstEntity> results = factory.getResultList(FirstEntity.class, query);
        assertEquals(limit, results.size());
        assertEquals(startKey, results.get(0).getId());
        assertEquals(endKey, results.get(results.size() - 1).getId());

        query = Query.get(select(allColumns(), from(FirstEntity.class), where(startAt(startKey)), limit(limit)));
        log.debug(query.getQuery());
        results = factory.getResultList(FirstEntity.class, query);
        assertEquals(limit, results.size());
        assertEquals(startKey, results.get(0).getId());
        assertEquals(endKey, results.get(results.size() - 1).getId());
    }

    private void testIndexedPropertyEQ(Class<?> entityClass, Map<String, Object> params)
            throws InvocationTargetException, NoSuchMethodException, IllegalAccessException {
        Object entity = factory.getInstance(entityClass);
        List<Predicate> predicates = new ArrayList<Predicate>();
        for (Map.Entry<String, Object> entry : params.entrySet()) {
            String property = entry.getKey();
            Object value = entry.getValue();
            PropertyUtils.setProperty(entity, property, value);
            predicates.add(eq(property, value));
        }
        factory.persist(entity);
        Object loadedEntity = factory.getSingleResult(entityClass, Query.get(select(allColumns(), from(entityClass),
                where(predicates.toArray(new Predicate[predicates.size()])))));
        assertEquals(entity, loadedEntity);
    }

    private void testIndexedPropertyRanges(Class<?> entityClass, String property, Object value, Object lesser,
            Object upper) throws InvocationTargetException, NoSuchMethodException, IllegalAccessException {
        Object entity = factory.getInstance(entityClass);
        PropertyUtils.setProperty(entity, property, value);
        factory.persist(entity);
        Object loadedEntity = factory.getSingleResult(entityClass, Query.get(
                select(allColumns(), from(entityClass), where(type(FirstEntity.class), gt(property, lesser)))));
        assertEquals(entity, loadedEntity);
        loadedEntity = factory.getSingleResult(entityClass, Query.get(
                select(allColumns(), from(entityClass), where(type(FirstEntity.class), gte(property, lesser)))));
        assertEquals(entity, loadedEntity);
        loadedEntity = factory.getSingleResult(entityClass, Query.get(
                select(allColumns(), from(entityClass), where(type(FirstEntity.class), gte(property, value)))));
        assertEquals(entity, loadedEntity);
        loadedEntity = factory.getSingleResult(entityClass, Query
                .get(select(allColumns(), from(entityClass), where(type(FirstEntity.class), lt(property, upper)))));
        assertEquals(entity, loadedEntity);
        loadedEntity = factory.getSingleResult(entityClass, Query.get(
                select(allColumns(), from(entityClass), where(type(FirstEntity.class), lte(property, upper)))));
        assertEquals(entity, loadedEntity);
        loadedEntity = factory.getSingleResult(entityClass, Query.get(
                select(allColumns(), from(entityClass), where(type(FirstEntity.class), lte(property, value)))));
        assertEquals(entity, loadedEntity);
        loadedEntity = factory.getSingleResult(entityClass, Query.get(select(allColumns(), from(entityClass),
                where(type(FirstEntity.class), between(property, lesser, upper)))));
        assertEquals(entity, loadedEntity);
    }

    private void testPropertyLazyAccess(Class<?> entityClass, String id, String property)
            throws NoSuchFieldException, IllegalAccessException, InvocationTargetException, NoSuchMethodException {
        Object loadedEntity = factory.get(entityClass, id);
        Field privateField = entityClass.getDeclaredField(property);
        privateField.setAccessible(true);
        Object fieldValue = privateField.get(loadedEntity);
        assertTrue("expected null or size 0 since getter has not been invoked due to lazy loading",
                isNullPropertyOrEmptyCollection(fieldValue));
        Object value = PropertyUtils.getProperty(loadedEntity, property);
        assertTrue(
                "expected not null or size > 0  after reading property via getter and property has been lazy loaded",
                !isNullPropertyOrEmptyCollection(value));
        fieldValue = privateField.get(loadedEntity);
        value = PropertyUtils.getProperty(loadedEntity, property);
        assertTrue(
                "expected not null or size > 0  after reading property via getter and property has been lazy loaded",
                !isNullPropertyOrEmptyCollection(fieldValue));
        assertSame("expected same memory reference since collection was already loaded", fieldValue, value);
    }

    private void testPropertyEagerAccess(Class<?> entityClass, String id, String property)
            throws NoSuchFieldException, IllegalAccessException, InvocationTargetException, NoSuchMethodException {
        Object loadedEntity = factory.get(entityClass, id);
        Field privateField = entityClass.getDeclaredField(property);
        privateField.setAccessible(true);
        Object fieldValue = privateField.get(loadedEntity);
        assertTrue("expected not null or size > 0 since collection should be eagerly loaded",
                !isNullPropertyOrEmptyCollection(fieldValue));
        Object value = PropertyUtils.getProperty(loadedEntity, property);
        assertSame("expected same memory reference since collection was already loaded", fieldValue, value);
    }

    private static boolean isNullPropertyOrEmptyCollection(Object value) {
        boolean match = value == null;
        if (!match) {
            if (Collection.class.isAssignableFrom(value.getClass())) {
                match = ((Collection) value).size() == 0;
            }
        }
        return match;
    }

    @Test
    public void testPropertyEquality() {
        String string = rds();
        Date date = new Date();
        Long longNumber = 3L;
        Double score = 99.0;
        SecondEntity secondEntity = factory.getInstance(SecondEntity.class);
        factory.persist(secondEntity);

        FirstEntity entity = factory.getInstance(FirstEntity.class);
        entity.setName(string);
        entity.setDate(date);
        entity.setPhone(longNumber);
        entity.setScore(score);
        entity.setMappedEntity(secondEntity);
        factory.persist(entity);

        assertNotNull(entity.getId());

        FirstEntity loadedEntity = factory.get(FirstEntity.class, entity.getId());
        assertEquals(string, loadedEntity.getName());
        assertEquals(date, loadedEntity.getDate());
        assertEquals(longNumber, loadedEntity.getPhone());
        assertEquals(score, loadedEntity.getScore());
        assertEquals(secondEntity, loadedEntity.getMappedEntity());
    }

    @Test
    public void testPersistence() throws Exception {

        FirstEntity a = factory.getInstance(FirstEntity.class);
        a.setName(rds());
        a.setDescription(rds());
        a.setPhone(1L);
        a.setScore(3.0);
        a.setDate(new Date());
        a.setOtherDate(new Date(a.getDate().getTime() - 1000));
        a.setChangedColumnName(rds());
        factory.persist(a);

        //associations
        OtherEntity c = factory.getInstance(OtherEntity.class);
        c.setFirstProperty(rds());

        ThirdEntity thirdEntity = factory.getInstance(ThirdEntity.class);
        thirdEntity.setSomeProperty(rds());

        FourthEntity fourthEntity = factory.getInstance(FourthEntity.class);
        fourthEntity.setSomeProperty(rds());

        thirdEntity.setFourthEntity(fourthEntity);

        c.setNestedThirdProperty(thirdEntity);

        a.setOtherEntity(c);

        //mapped associations
        SecondEntity x = factory.getInstance(SecondEntity.class);
        x.setName(rds());
        factory.persist(x);

        SecondEntity z = factory.getInstance(SecondEntity.class);
        z.setName(rds());

        ThirdEntity embedEntityInRecursiveMappedEntity = new ThirdEntity();
        embedEntityInRecursiveMappedEntity.setSomeProperty(rds());

        z.setEmbedEntityInRecursiveMappedEntity(embedEntityInRecursiveMappedEntity);
        x.setRecursiveMapped(z);
        factory.persist(z);
        factory.persist(x);

        a.setMappedEntity(x);

        factory.persist(a);

        //log.debug("created id is: " + a.getId());
        FirstEntity b = factory.get(FirstEntity.class, a.getId());
        assertNotNull(b);
        assertEquals(b.getId(), a.getId());
        assertEquals(b.getName(), a.getName());
        assertEquals(b.getDescription(), a.getDescription());
        assertEquals(b.getPhone(), a.getPhone());
        assertEquals(b.getScore(), a.getScore());
        assertEquals(b.getDate(), a.getDate());
        assertEquals(b.getOtherDate(), a.getOtherDate());
        assertEquals(b.getChangedColumnName(), a.getChangedColumnName());
        assertTrue(b.getOtherDate().before(a.getDate()));
        assertNotNull(b.getOtherEntity());
        assertNotNull(a.getOtherEntity());
        assertNotNull(a.getMappedEntity());
        assertNotNull(b.getMappedEntity());
        assertNotNull(a.getMappedEntity().getName());
        assertNotNull(b.getMappedEntity().getName());
        assertNotNull(a.getMappedEntity().getRecursiveMapped());
        assertNotNull(b.getMappedEntity().getRecursiveMapped());
        assertNotNull(a.getMappedEntity().getRecursiveMapped().getEmbedEntityInRecursiveMappedEntity());
        assertNotNull(b.getMappedEntity().getRecursiveMapped().getEmbedEntityInRecursiveMappedEntity());
        assertNotNull(
                a.getMappedEntity().getRecursiveMapped().getEmbedEntityInRecursiveMappedEntity().getSomeProperty());
        assertNotNull(
                b.getMappedEntity().getRecursiveMapped().getEmbedEntityInRecursiveMappedEntity().getSomeProperty());
        assertEquals(b.getMappedEntity().getName(), a.getMappedEntity().getName());
        assertNotNull(a.getOtherEntity().getNestedThirdProperty());
        assertNotNull(b.getOtherEntity().getNestedThirdProperty());
        assertNotNull(a.getOtherEntity().getNestedThirdProperty().getFourthEntity());
        assertNotNull(b.getOtherEntity().getNestedThirdProperty().getFourthEntity());
        assertNull(a.getOtherEntity().getNestedThirdProperty().getFourthEntityNull());
        assertNull(b.getOtherEntity().getNestedThirdProperty().getFourthEntityNull());
        assertNotNull(a.getOtherEntity());
        assertEquals(b.getOtherEntity(), a.getOtherEntity());
        assertEquals(b.getMappedEntity(), a.getMappedEntity());
        assertEquals(b.getMappedEntity().getRecursiveMapped(), a.getMappedEntity().getRecursiveMapped());
        assertEquals(b.getMappedEntity().getRecursiveMapped().getEmbedEntityInRecursiveMappedEntity(),
                a.getMappedEntity().getRecursiveMapped().getEmbedEntityInRecursiveMappedEntity());
        assertEquals(
                b.getMappedEntity().getRecursiveMapped().getEmbedEntityInRecursiveMappedEntity().getSomeProperty(),
                a.getMappedEntity().getRecursiveMapped().getEmbedEntityInRecursiveMappedEntity().getSomeProperty());
        assertEquals(b.getMappedEntity().getId(), x.getId());
        assertEquals(b.getOtherEntity().getNestedThirdProperty(), a.getOtherEntity().getNestedThirdProperty());
        assertEquals(b.getOtherEntity().getNestedThirdProperty().getFourthEntity(),
                a.getOtherEntity().getNestedThirdProperty().getFourthEntity());
        assertEquals(b, a);

        String newName = "nameChanged";
        double score = 99.0;
        factory.executeQuery(Integer.class, Query.get(update(columnFamily("FirstEntity"),
                set(assign("name", newName), assign("score", score)), where(keyIn(a.getId())))));
        FirstEntity loadedAfterUpdate = factory.get(FirstEntity.class, a.getId());
        assertEquals(newName, loadedAfterUpdate.getName());
        assertEquals(score, loadedAfterUpdate.getScore());

        List<FirstEntity> results = factory.getResultList(FirstEntity.class,
                Query.get(select(allColumns(), from("FirstEntity"))));
        assertEquals(1, results.size());
    }

}