/* | |
* TestClassDBSequenceFactory.java | |
* | |
* Created on October 6, 2006, 11:29 AM | |
* | |
* 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.schema; | |
import java.util.*; | |
import org.apache.openjpa.conf.OpenJPAConfiguration; | |
import org.apache.openjpa.jdbc.conf.JDBCConfiguration; | |
import org.apache.openjpa.jdbc.kernel.ClassTableJDBCSeq; | |
import org.apache.openjpa.jdbc.meta.ClassMapping; | |
import org.apache.openjpa.jdbc.schema.Sequence; | |
import org.apache.openjpa.kernel.Broker; | |
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 TestClassDBSequenceFactory extends org.apache.openjpa.persistence.jdbc.kernel.BaseJDBCTest{ | |
/** Creates a new instance of TestClassDBSequenceFactory */ | |
public TestClassDBSequenceFactory() { | |
} | |
public TestClassDBSequenceFactory(String test) { | |
super(test); | |
} | |
public void setUp() { | |
deleteAll(SeqE.class); | |
} | |
boolean supportsPessimisticLocking() { | |
OpenJPAConfiguration conf = getConfiguration(); | |
return conf instanceof JDBCConfiguration | |
&& ((JDBCConfiguration) conf).getDBDictionaryInstance(). | |
supportsSelectForUpdate; | |
} | |
public void testVirtualSuperclass() { | |
OpenJPAEntityManagerFactory pmf =(OpenJPAEntityManagerFactory) | |
getEmf(getProps()); | |
OpenJPAEntityManager pm = (OpenJPAEntityManager) pmf.createEntityManager(); | |
//FIXME jthomas | |
//Sequence gen = pm.getIdentitySequence(SeqF.class); | |
Sequence gen=null; | |
long next = ((Number) gen.getIncrement()).longValue(); | |
//FIXME jthomas | |
//gen = pm.getIdentitySequence(SeqG.class); | |
assertEquals(next + 1, ((Number) gen.getIncrement()).longValue()); | |
pm.close(); | |
pmf.close(); | |
} | |
public void testIgnoreVirtualSuperclass() { | |
Map props=new HashMap(); | |
props.put("TableName", "JDO_CLASS_SEQUENCE"); | |
props.put("IgnoreVirtual", "true"); | |
OpenJPAEntityManagerFactory pmf =(OpenJPAEntityManagerFactory) | |
getEmf(props); | |
OpenJPAEntityManager pm = pmf.createEntityManager(); | |
//FIXME jthomas | |
//Sequence gen = pm.getIdentitySequence(SeqF.class); | |
Sequence gen =null; | |
long next = ((Number) gen.getIncrement()).longValue(); | |
//FIXME jthomas | |
//Sequence gen2 = pm.getIdentitySequence(SeqG.class); | |
Sequence gen2 =null; | |
long next2 = ((Number) gen2.getIncrement()).longValue(); | |
if (next2 != next + 1) | |
return; // valid. | |
assertTrue(((Number) gen.getIncrement()).longValue() != next2 + 1); | |
pm.close(); | |
pmf.close(); | |
} | |
/** | |
* Based on reported bug case. | |
*/ | |
public void testNoSequenceHolesOnAttach() { | |
PerClassTestObject3 pc = new PerClassTestObject3(); | |
OpenJPAEntityManager pm =(OpenJPAEntityManager)currentEntityManager(); | |
startTx(pm);; | |
pm.persist(pc); | |
endTx(pm);; | |
long id1 = pc.getId(); | |
pc = new PerClassTestObject3(); | |
startTx(pm);; | |
pm.persist(pc); | |
long id2 = pc.getId(); | |
endTx(pm);; | |
pm.close(); | |
pc = new PerClassTestObject3(); | |
pm = (OpenJPAEntityManager)currentEntityManager(); | |
startTx(pm);; | |
pm.persist(pc); | |
endTx(pm);; | |
long id3 = pc.getId(); | |
pm.close(); | |
assertEquals(id1 + 1, id2); | |
assertEquals(id2 + 1, id3); | |
} | |
/** | |
* Tests that all sequence numbers are unique and in order. | |
* Will fail for dbs without pessimistic locking. | |
*/ | |
public void testSequence() | |
throws Exception { | |
if (!(supportsPessimisticLocking())) | |
return; | |
Set set = new HashSet(); | |
JDBCConfiguration conf = (JDBCConfiguration) getConfiguration(); | |
Broker broker = getBrokerFactory().newBroker(); | |
UpdateThread t1 = new UpdateThread(set, broker); | |
UpdateThread t2 = new UpdateThread(set, broker); | |
t1.start(); | |
t2.start(); | |
t1.join(); | |
t2.join(); | |
if (t1.error != null) | |
throw t1.error; | |
if (t2.error != null) | |
throw t2.error; | |
assertEquals(102, set.size()); | |
} | |
public void testSequenceGenerator() { | |
OpenJPAEntityManager pm =(OpenJPAEntityManager)currentEntityManager(); | |
// make sure the sequence generator creates separate | |
// instances. | |
for (int i = 0; i < 100; i++) { | |
//FIXME jthomas | |
/*assertEquals(((Number) pm.getIdentitySequence(SeqD.class). | |
next()).longValue() + 1, | |
((Number) pm.getIdentitySequence(SeqD.class). | |
getIncrement()).longValue()); | |
*/ | |
} | |
// make sure the sequence generate is not the same as is | |
// used elsewhere | |
for (int j = 0; j < 100; j++) { | |
//FIXME | |
/* | |
assertNotEquals(new Long(((Number) pm.getIdentitySequence | |
(SeqA.class).getIncrement()).longValue() + 1), | |
pm.getIdentitySequence(SeqD.class).next()); | |
*/ | |
} | |
} | |
public static void main(String[] args) { | |
//main(); | |
} | |
private Map getProps() { | |
Map props=new HashMap(); | |
props.put("openjpa.Sequence", "db-class(TableName=JDO_CLASS_SEQUENCE"); | |
return props; | |
} | |
private static class UpdateThread | |
extends Thread { | |
private Set _set = null; | |
private Broker _broker = null; | |
public Exception error = null; | |
public UpdateThread(Set set, Broker broker) { | |
_set = set; | |
_broker = broker; | |
} | |
public void run() { | |
try { | |
ClassMapping mapping = | |
((JDBCConfiguration) _broker.getConfiguration()). | |
getMappingRepositoryInstance(). | |
getMapping(SeqD.class, null, true); | |
ClassTableJDBCSeq seq = (ClassTableJDBCSeq) | |
_broker.getIdentitySequence(mapping); | |
for (int i = 0; i < 51; i++) | |
_set.add(seq.next(_broker, mapping)); | |
} catch (Exception e) { | |
error = e; | |
} | |
} | |
} | |
} |