/*****************************************************************
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.apache.cayenne.access;
import org.apache.cayenne.Cayenne;
import org.apache.cayenne.DataRow;
import org.apache.cayenne.ObjectContext;
import org.apache.cayenne.PersistenceState;
import org.apache.cayenne.di.Inject;
import org.apache.cayenne.query.SelectQuery;
import org.apache.cayenne.test.jdbc.DBHelper;
import org.apache.cayenne.test.jdbc.TableHelper;
import org.apache.cayenne.testdo.embeddable.EmbedEntity1;
import org.apache.cayenne.testdo.embeddable.Embeddable1;
import org.apache.cayenne.unit.di.server.CayenneProjects;
import org.apache.cayenne.unit.di.server.ServerCase;
import org.apache.cayenne.unit.di.server.UseServerRuntime;
import org.junit.Before;
import org.junit.Test;
import java.util.List;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
@UseServerRuntime(CayenneProjects.EMBEDDABLE_PROJECT)
public class EmbeddingIT extends ServerCase {
@Inject
protected ObjectContext context;
@Inject
protected DBHelper dbHelper;
protected TableHelper tEmbedEntity1;
@Before
public void setUp() throws Exception {
tEmbedEntity1 = new TableHelper(dbHelper, "EMBED_ENTITY1");
tEmbedEntity1.setColumns("ID", "NAME", "EMBEDDED10", "EMBEDDED20", "EMBEDDED30", "EMBEDDED40");
}
protected void createSelectDataSet() throws Exception {
tEmbedEntity1.delete().execute();
tEmbedEntity1.insert(1, "n1", "e1", "e2", "e3", "e4");
tEmbedEntity1.insert(2, "n2", "ex1", "ex2", "ex3", "ex4");
}
protected void createUpdateDataSet() throws Exception {
tEmbedEntity1.delete().execute();
tEmbedEntity1.insert(1, "n1", "e1", "e2", "e3", "e4");
}
@Test
public void testSelect() throws Exception {
createSelectDataSet();
SelectQuery query = new SelectQuery(EmbedEntity1.class);
query.addOrdering(EmbedEntity1.NAME.asc());
List<?> results = context.performQuery(query);
assertEquals(2, results.size());
EmbedEntity1 o1 = (EmbedEntity1) results.get(0);
assertEquals("n1", o1.getName());
Embeddable1 e11 = o1.getEmbedded1();
Embeddable1 e12 = o1.getEmbedded2();
assertNotNull(e11);
assertNotNull(e12);
assertEquals("e1", e11.getEmbedded10());
assertEquals("e2", e11.getEmbedded20());
assertEquals("e3", e12.getEmbedded10());
assertEquals("e4", e12.getEmbedded20());
EmbedEntity1 o2 = (EmbedEntity1) results.get(1);
assertEquals("n2", o2.getName());
Embeddable1 e21 = o2.getEmbedded1();
Embeddable1 e22 = o2.getEmbedded2();
assertNotNull(e21);
assertNotNull(e22);
assertEquals("ex1", e21.getEmbedded10());
assertEquals("ex2", e21.getEmbedded20());
assertEquals("ex3", e22.getEmbedded10());
assertEquals("ex4", e22.getEmbedded20());
}
@Test
public void testInsert() throws Exception {
EmbedEntity1 o1 = context.newObject(EmbedEntity1.class);
o1.setName("NAME");
Embeddable1 e1 = new Embeddable1();
// init before the embeddable was set on an owning object
e1.setEmbedded10("E11");
e1.setEmbedded20("E12");
o1.setEmbedded1(e1);
Embeddable1 e2 = new Embeddable1();
o1.setEmbedded2(e2);
// init after it was set on the owning object
e2.setEmbedded10("E21");
e2.setEmbedded20("E22");
context.commitChanges();
SelectQuery<DataRow> query = SelectQuery.dataRowQuery(EmbedEntity1.class);
DataRow row = query.selectOne(context);
assertNotNull(row);
assertEquals("E11", row.get("EMBEDDED10"));
assertEquals("E12", row.get("EMBEDDED20"));
assertEquals("E21", row.get("EMBEDDED30"));
assertEquals("E22", row.get("EMBEDDED40"));
}
@Test
public void testUpdateEmbeddedProperties() throws Exception {
createUpdateDataSet();
SelectQuery query = new SelectQuery(EmbedEntity1.class);
query.addOrdering(EmbedEntity1.NAME.asc());
List<?> results = context.performQuery(query);
EmbedEntity1 o1 = (EmbedEntity1) results.get(0);
Embeddable1 e11 = o1.getEmbedded1();
e11.setEmbedded10("x1");
assertEquals(PersistenceState.MODIFIED, o1.getPersistenceState());
context.commitChanges();
SelectQuery query1 = new SelectQuery(EmbedEntity1.class);
query1.setFetchingDataRows(true);
DataRow row = (DataRow) Cayenne.objectForQuery(context, query1);
assertNotNull(row);
assertEquals("x1", row.get("EMBEDDED10"));
}
@Test
public void testUpdateEmbedded() throws Exception {
createUpdateDataSet();
SelectQuery query = new SelectQuery(EmbedEntity1.class);
query.addOrdering(EmbedEntity1.NAME.asc());
List<?> results = context.performQuery(query);
EmbedEntity1 o1 = (EmbedEntity1) results.get(0);
Embeddable1 e11 = new Embeddable1();
e11.setEmbedded10("x1");
e11.setEmbedded20("x2");
o1.setEmbedded1(e11);
assertEquals(PersistenceState.MODIFIED, o1.getPersistenceState());
context.commitChanges();
SelectQuery<DataRow> query1 = SelectQuery.dataRowQuery(EmbedEntity1.class);
DataRow row = query1.selectOne(context);
assertNotNull(row);
assertEquals("x1", row.get("EMBEDDED10"));
}
}