blob: fbf4d5baa901a7da6475309cfbb056625162761c [file] [log] [blame]
/*
* 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.openjpa.persistence.embed;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;
import org.apache.openjpa.persistence.ArgumentException;
import org.apache.openjpa.persistence.RollbackException;
import org.apache.openjpa.persistence.test.SingleEMFTestCase;
public class TestUpdateEmbeddedQueryResult extends SingleEMFTestCase {
public int ID = 1;
@Override
public void setUp() {
setUp(Embed.class,
Embed_Embed.class,
EntityA_Embed_Embed.class,
BaseEntity.class, Address.class, Geocode.class,
DROP_TABLES);
}
public void testUpdateEmbedded() {
EntityManager em = emf.createEntityManager();
Address a = new Address();
a.setStreetAddress("555 Bailey Ave");
a.setCity("San Jose");
a.setState("CA");
a.setZip(12955);
Geocode g = new Geocode();
g.setLatitude(1.0f);
g.setLongtitude(2.0f);
a.setGeocode(g);
em.getTransaction().begin();
em.persist(a);
em.getTransaction().commit();
em.clear();
em.getTransaction().begin();
String query = "select address from Address address" +
" where address.streetAddress = '555 Bailey Ave'";
List<Address> list = em.createQuery(query).getResultList();
Address a1 = list.get(0);
assertEquals(a1.getGeocode().getLatitude(),1.0f);
Long id = a1.getId();
g = new Geocode();
g.setLatitude(3.0f);
g.setLongtitude(4.0f);
a1.setGeocode(g);
em.getTransaction().commit();
Address a2 = em.find(Address.class, id);
assertEquals(a2.getGeocode().getLatitude(),3.0f);
em.getTransaction().begin();
g.setLatitude(5.0f);
a2.setGeocode(g);
em.getTransaction().commit();
em.clear();
Address a3 = em.find(Address.class, id);
assertEquals(a3.getGeocode().getLatitude(),5.0f);
em.clear();
query = "select a.geocode from Address a where a.id = ?1";
List<Geocode> rs = em.createQuery(query).setParameter(1, id).getResultList();
Geocode g2 = rs.get(0);
em.getTransaction().begin();
try {
g2.setLatitude(7.0f);
} catch (ArgumentException e) {
//as expected: update of embeddable field in query result is not allowed.
}
try {
em.getTransaction().commit();
} catch (RollbackException e) {
//as expected: update of embeddable field in query result is not allowed.
}
em.close();
}
public void testEntityA_Embed_Embed_update() {
createEntityA_Embed_Embed();
updateEmbedded_EntityA_Embed_Embed();
}
/*
* Create EntityA_Embed_Embed
*/
public void createEntityA_Embed_Embed() {
EntityManager em = emf.createEntityManager();
EntityTransaction tran = em.getTransaction();
createEntityA_Embed_Embed(em, ID);
tran.begin();
em.flush();
tran.commit();
em.close();
}
public void createEntityA_Embed_Embed(EntityManager em, int id) {
EntityA_Embed_Embed a = new EntityA_Embed_Embed();
a.setId(id);
a.setName("a" + id);
a.setAge(id);
Embed_Embed embed = createEmbed_Embed(em, id, 0);
a.setEmbed(embed);
em.persist(a);
}
public Embed_Embed createEmbed_Embed(EntityManager em, int id, int idx) {
Embed_Embed embed = new Embed_Embed();
embed.setIntVal1(id * 100 + idx * 10 + 1);
embed.setIntVal2(id * 100 + idx * 10 + 2);
embed.setIntVal3(id * 100 + idx * 10 + 3);
Embed embed1 = createEmbed(id, idx);
embed.setEmbed(embed1);
return embed;
}
public Embed createEmbed(int id, int idx) {
Embed embed = new Embed();
embed.setIntVal1(id * 100 + idx * 10 + 4);
embed.setIntVal2(id * 100 + idx * 10 + 5);
embed.setIntVal3(id * 100 + idx * 10 + 6);
return embed;
}
public void testBulkUpdateEmbeddedField() {
EntityManager em = emf.createEntityManager();
String update = "UPDATE EntityA_Embed_Embed a set a.embed.embed.intVal1 = ?1," +
" a.embed.embed.intVal2 = ?2 where a.id = 10";
em.getTransaction().begin();
int count = em.createQuery(update).setParameter(1, 100).setParameter(2, 200).executeUpdate();
em.getTransaction().commit();
assertEquals(count, 0);
// test invalid bulk update embeddable field
update = "UPDATE EntityA_Embed_Embed a set a.embed.embed = ?1";
Embed embed1 = createEmbed(ID, 10);
try {
int updateCount = em.createQuery(update).setParameter(1, embed1).executeUpdate();
} catch (ArgumentException e) {
// as expected: Bulk update of embeddable field is not allowed.
}
em.close();
}
/*
* update embedded object returned from query
*/
public void updateEmbedded_EntityA_Embed_Embed() {
EntityManager em = emf.createEntityManager();
// test update embedded object returned from query
String query[] = {
"select a.embed from EntityA_Embed_Embed a",
"select a.embed.embed from EntityA_Embed_Embed a",
"select a.embed as e from EntityA_Embed_Embed a ORDER BY e",
};
List rs = null;
Embed_Embed embedembed = null;
Embed embed = null;
EntityTransaction tran = em.getTransaction();
tran.begin();
for (int i = 0; i < query.length; i++) {
rs = em.createQuery(query[i]).getResultList();
assertTrue(rs.size() > 0);
try {
switch (i) {
case 0:
case 2:
embedembed = (Embed_Embed) rs.get(0);
embedembed.getEmbed().setIntVal1(1111);
embedembed.setEmbed(embed);
break;
case 1:
embed = (Embed) rs.get(0);
embed.setIntVal1(1111);
break;
}
} catch(ArgumentException e) {
// as expected:
// Update of embedded object returned from query result is not allowed.
}
}
try {
tran.commit();
} catch(RollbackException e) {
// as expected:
// Update of embedded object returned from query result is not allowed.
}
em.close();
}
}