blob: 7692905885926a2d235aad7fcdab5619efb5f90d [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.detach;
import org.apache.openjpa.persistence.OpenJPAEntityManagerSPI;
import org.apache.openjpa.persistence.test.SingleEMFTestCase;
/**
* Added for OPENJPA-1896
*/
public class TestMergeNoStateManager extends SingleEMFTestCase {
Object[] args =
new Object[] { TimestampVersionEntity.class, IntVersionEntity.class, NoVersionEntity.class,
IntegerVersionEntity.class, CLEAR_TABLES
// , "openjpa.Log", "SQL=trace"
};
IntVersionEntity _ive;
NoVersionEntity _nve;
IntegerVersionEntity _integerVe;
@Override
public void setUp() throws Exception {
super.setUp(args);
OpenJPAEntityManagerSPI em = emf.createEntityManager();
try {
if (em.find(IntVersionEntity.class, 1) == null) {
em.getTransaction().begin();
_ive = new IntVersionEntity(1);
_nve = new NoVersionEntity(1);
_integerVe = new IntegerVersionEntity(1);
em.persist(_ive);
em.persist(_nve);
em.persist(_integerVe);
em.getTransaction().commit();
}
} finally {
em.close();
}
}
/**
* This test is commented out is it will fail.
*/
// public void testOLE() throws Exception {
// OpenJPAEntityManagerSPI em = emf.createEntityManager();
// try {
// String updatedName = "updatedName_" + System.currentTimeMillis();
// IntVersionEntity ive = em.find(IntVersionEntity.class, _ive.getId());
// em.clear();
//
// IntVersionEntity detachedIve = new IntVersionEntity(_ive.getId());
// // Set the version to older than currently in the db to simulate having stale data
// detachedIve.setId(0);
// detachedIve.setName(updatedName);
// // serialize
// detachedIve = roundtrip(detachedIve);
//
// em.getTransaction().begin();
// // This merge should throw an OLE since we have older version than current
// try {
// em.merge(detachedIve);
// throw new RuntimeException("Expected an OLE, but didn't get one!");
// } catch (OptimisticLockException ole) {
// // expected
// }
// } finally {
// if (em.getTransaction().isActive()) {
// em.getTransaction().rollback();
// }
// em.close();
// }
// }
public void test() throws Exception {
OpenJPAEntityManagerSPI em = emf.createEntityManager();
try {
String updatedName = "updatedName_" + System.currentTimeMillis();
IntVersionEntity detachedIve = new IntVersionEntity(_ive.getId());
NoVersionEntity detachedNve = new NoVersionEntity(_nve.getId());
IntegerVersionEntity detachedIntegerVe = new IntegerVersionEntity(_integerVe.getId());
detachedIntegerVe.setName(updatedName);
detachedNve.setName(updatedName);
detachedIve.setName(updatedName);
em.getTransaction().begin();
em.merge(detachedIntegerVe);
em.merge(detachedNve);
em.merge(detachedIve);
em.getTransaction().commit();
em.clear();
detachedIntegerVe = em.find(IntegerVersionEntity.class, _integerVe.getId());
detachedNve = em.find(NoVersionEntity.class, _nve.getId());
detachedIve = em.find(IntVersionEntity.class, _ive.getId());
// Make sure the updated values were persisted
assertEquals(detachedIntegerVe.getName(), updatedName);
assertEquals(detachedNve.getName(), updatedName);
assertEquals(detachedIve.getName(), updatedName);
} finally {
if (em.getTransaction().isActive()) {
em.getTransaction().commit();
}
em.close();
}
}
}