blob: 3e3a0e301bd12c954c1fd30901dfa961a2087df0 [file] [log] [blame]
/*
* TestStateImage.java
*
* Created on October 4, 2006, 3:09 PM
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/
/*
* 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.jdbc.meta;
import java.util.*;
import org.apache.openjpa.kernel.Query;
import org.apache.openjpa.persistence.OpenJPAQuery;
import org.apache.openjpa.persistence.jdbc.common.apps.*;
import java.lang.annotation.Annotation;
import junit.framework.*;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import org.apache.openjpa.persistence.OpenJPAEntityManagerFactory;
import org.apache.openjpa.persistence.OpenJPAEntityManager;
public class TestStateImage extends org.apache.openjpa.persistence.jdbc.kernel.TestSQLListenerTestCase {
private Object _oid = null;
/** Creates a new instance of TestStateImage */
public TestStateImage() {
}
public TestStateImage(String test) {
super(test);
}
public void setUpTestCase() {
deleteAll(StateImagePC2.class);
deleteAll(StateImagePC3.class);
StateImagePC2 pc = new StateImagePC2();
pc.setStringField("string1");
pc.setIntField(1);
StateImagePC2 pc2 = new StateImagePC2();
pc2.setStringField("string2");
pc2.setIntField(2);
pc.setStateImage(pc2);
OpenJPAEntityManager pm =(OpenJPAEntityManager)currentEntityManager();
pm.getTransaction().begin();
pm.persist(pc);
_oid = pm.getObjectId(pc);
pm.getTransaction().commit();
pm.close();
}
public void testOptLock() {
OpenJPAEntityManager pm1 = getEm(true, true);
OpenJPAEntityManager pm2 = getEm(true, true);
pm1.getTransaction().begin();
pm2.getTransaction().begin();
StateImagePC2 pc1 = (StateImagePC2) pm1.getObjectId(_oid);
StateImagePC2 pc2 = (StateImagePC2) pm2.getObjectId(_oid);
pc1.setIntField(3);
pc1.setStateImage(null);
pc2.setIntField(4);
pm1.getTransaction().commit();
try {
pm2.getTransaction().commit();
fail("Should have caused OL exception.");
} catch (Exception jfe) {
pm2.getTransaction().begin();
pm2.refresh(pc2);
pc2.setIntField(4);
pm2.getTransaction().commit();
}
// make sure the next transaction works too
pm2.getTransaction().begin();
pc2.setIntField(5);
pm2.getTransaction().commit();
pm1.getTransaction().begin();
pm1.refresh(pc1);
pc1.setIntField(6);
pm2.getTransaction().begin();
pc2.setIntField(7);
pm1.getTransaction().commit();
try {
pm2.getTransaction().commit();
fail("Should have caused OL exception.");
} catch (Exception jfe) {
pm2.getTransaction().begin();
pm2.refresh(pc2);
pc2.setIntField(7);
pm2.getTransaction().commit();
}
pm1.close();
pm2.close();
OpenJPAEntityManager pm =(OpenJPAEntityManager)currentEntityManager();
StateImagePC2 pc = (StateImagePC2) pm.getObjectId(_oid);
assertNull(pc.getStateImage());
assertEquals(7, pc.getIntField());
pm.close();
}
/**
* This currently isn't working: state-image locking will not
* detect when someone else updated the row before deleting.
*/
public void NOTWORKINGtestOptLockWithDelete() {
OpenJPAEntityManager pm1 = getEm(true, true);
StateImagePC2 pc1 = (StateImagePC2) pm1.getObjectId(_oid);
OpenJPAEntityManager pm2 = getEm(true, true);
StateImagePC2 pc2 = (StateImagePC2) pm2.getObjectId(_oid);
pm1.getTransaction().begin();
pc1.setIntField(3);
pm2.getTransaction().begin();
pm2.remove(pc2);
pm1.getTransaction().commit();
try {
pm2.getTransaction().commit();
fail("Should have caused OL exception.");
} catch (Exception jfe) {
pm2.getTransaction().begin();
pm2.refresh(pc2);
pm2.remove(pc2);
pm2.getTransaction().commit();
}
}
public void testOptLockOnVerticalClass() {
OpenJPAEntityManager pm1 = getEm(true, true);
OpenJPAEntityManager pm2 = getEm(true, true);
// have to load via query or extent where we're selecting the vertical
// field in the initial SELECT
OpenJPAQuery q1 = pm1.createNativeQuery("",StateImagePC2.class);
//FIXME jthomas
//q1.setOrdering("intField ascending");
StateImagePC2 pc1 = (StateImagePC2) ((Collection) q1.getCandidateCollection()).
iterator().next();
q1.closeAll();
OpenJPAQuery q2 = pm2.createNativeQuery("",StateImagePC2.class);
//FIXME jthomas
//q2.setOrdering("intField ascending");
StateImagePC2 pc2 = (StateImagePC2) ((Collection) q2.getCandidateCollection()).
iterator().next();
q2.closeAll();
pm1.getTransaction().begin();
pc1.setStringField("changed1");
pc1.setStateImage(null);
pm2.getTransaction().begin();
pc2.setStringField("changed2");
pm1.getTransaction().commit();
try {
pm2.getTransaction().commit();
fail("Should have caused OL exception.");
} catch (Exception jfe) {
pm2.getTransaction().begin();
pm2.refresh(pc2);
pc2.setStringField("changed2");
pm2.getTransaction().commit();
}
pm1.close();
pm2.close();
OpenJPAEntityManager pm =(OpenJPAEntityManager)currentEntityManager();
StateImagePC2 pc = (StateImagePC2) pm.getObjectId(_oid);
assertNull(pc.getStateImage());
assertEquals("changed2", pc.getStringField());
pm.close();
}
public void testLockGroup()
throws Exception {
OpenJPAEntityManager pm = getEm(true, true);
pm.getTransaction().begin();
StateImagePC3 pc = new StateImagePC3();
pc.setLockField(4);
pc.setNoLockField(6);
pm.persist(pc);
pm.getTransaction().commit();
pm.getTransaction().begin();
pc.setLockField(6);
sql.clear();
pm.getTransaction().commit();
assertNotSQL("* WHERE * NOLOCK*");
pm.close();
}
public static void main(String[] args) {
//FIXME
//main(TestStateImage.class);
}
private OpenJPAEntityManager getEm(boolean optimistic,boolean retainValues){
OpenJPAEntityManager em = currentEntityManager();
em.setNontransactionalRead(true);
em.setRetainState(retainValues);
em.setOptimistic(optimistic);
return em;
}
}