mirror of https://github.com/apache/openjpa.git
OPENJPA-557 Primary key sequences broken with postgres schemas
Commit patch provided by Milosz Tylenda git-svn-id: https://svn.apache.org/repos/asf/openjpa/trunk@729180 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
1437517d8c
commit
fb7ab1908b
|
@ -113,9 +113,8 @@ public class PostgresDictionary
|
||||||
requiresAliasForSubselect = true;
|
requiresAliasForSubselect = true;
|
||||||
allowsAliasInBulkClause = false;
|
allowsAliasInBulkClause = false;
|
||||||
|
|
||||||
// {2} is the result of getGeneratedKeySequenceName; the
|
|
||||||
// single-quote escape will result in SELECT CURVAL('mysequence')
|
// single-quote escape will result in SELECT CURVAL('mysequence')
|
||||||
lastGeneratedKeyQuery = "SELECT CURRVAL(''{2}'')";
|
lastGeneratedKeyQuery = "SELECT CURRVAL(''{1}_{0}_seq'')";
|
||||||
supportsAutoAssign = true;
|
supportsAutoAssign = true;
|
||||||
autoAssignTypeName = "BIGSERIAL";
|
autoAssignTypeName = "BIGSERIAL";
|
||||||
nextSequenceQuery = "SELECT NEXTVAL(''{0}'')";
|
nextSequenceQuery = "SELECT NEXTVAL(''{0}'')";
|
||||||
|
|
|
@ -21,9 +21,6 @@ package org.apache.openjpa.persistence.generationtype;
|
||||||
import javax.persistence.*;
|
import javax.persistence.*;
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
|
|
||||||
/**
|
|
||||||
* Extension of Animal class illustrating inheritance.
|
|
||||||
*/
|
|
||||||
@Entity(name = "Dog1")
|
@Entity(name = "Dog1")
|
||||||
@Table(name = "DOGAUTO", schema = "SCHEMA1")
|
@Table(name = "DOGAUTO", schema = "SCHEMA1")
|
||||||
public class Dog1 implements Serializable
|
public class Dog1 implements Serializable
|
||||||
|
|
|
@ -21,9 +21,6 @@ package org.apache.openjpa.persistence.generationtype;
|
||||||
import javax.persistence.*;
|
import javax.persistence.*;
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
|
|
||||||
/**
|
|
||||||
* Extension of Animal class illustrating inheritance.
|
|
||||||
*/
|
|
||||||
@Entity(name = "Dog2")
|
@Entity(name = "Dog2")
|
||||||
@Table(name = "DOGAUTO", schema = "SCHEMA2")
|
@Table(name = "DOGAUTO", schema = "SCHEMA2")
|
||||||
public class Dog2 implements Serializable
|
public class Dog2 implements Serializable
|
||||||
|
|
|
@ -0,0 +1,51 @@
|
||||||
|
/*
|
||||||
|
* 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.generationtype;
|
||||||
|
|
||||||
|
import javax.persistence.Entity;
|
||||||
|
import javax.persistence.GeneratedValue;
|
||||||
|
import javax.persistence.GenerationType;
|
||||||
|
import javax.persistence.Id;
|
||||||
|
import javax.persistence.Table;
|
||||||
|
|
||||||
|
@Entity(name = "Dog3")
|
||||||
|
@Table(name = "DOGIDENT", schema = "SCHEMA1")
|
||||||
|
public class Dog3 {
|
||||||
|
@Id
|
||||||
|
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||||
|
private int id;
|
||||||
|
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
public int getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId(int id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setName(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,51 @@
|
||||||
|
/*
|
||||||
|
* 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.generationtype;
|
||||||
|
|
||||||
|
import javax.persistence.Entity;
|
||||||
|
import javax.persistence.GeneratedValue;
|
||||||
|
import javax.persistence.GenerationType;
|
||||||
|
import javax.persistence.Id;
|
||||||
|
import javax.persistence.Table;
|
||||||
|
|
||||||
|
@Entity(name = "Dog4")
|
||||||
|
@Table(name = "DOGIDENT4")
|
||||||
|
public class Dog4 {
|
||||||
|
@Id
|
||||||
|
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||||
|
private int id;
|
||||||
|
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
public int getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId(int id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setName(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
}
|
|
@ -22,9 +22,6 @@ package org.apache.openjpa.persistence.generationtype;
|
||||||
import javax.persistence.*;
|
import javax.persistence.*;
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
|
|
||||||
/**
|
|
||||||
* Extension of Animal class illustrating inheritance.
|
|
||||||
*/
|
|
||||||
@Entity(name = "DogTable")
|
@Entity(name = "DogTable")
|
||||||
@Table(name = "DOGTABLES", schema = "SCHEMA1")
|
@Table(name = "DOGTABLES", schema = "SCHEMA1")
|
||||||
public class DogTable implements Serializable
|
public class DogTable implements Serializable
|
||||||
|
|
|
@ -21,9 +21,6 @@ package org.apache.openjpa.persistence.generationtype;
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
import javax.persistence.*;
|
import javax.persistence.*;
|
||||||
|
|
||||||
/**
|
|
||||||
* Extension of Animal class illustrating inheritance.
|
|
||||||
*/
|
|
||||||
@Entity(name = "DogTable2")
|
@Entity(name = "DogTable2")
|
||||||
@Table(name = "DOGTABLES", schema = "SCHEMA2")
|
@Table(name = "DOGTABLES", schema = "SCHEMA2")
|
||||||
public class DogTable2 implements Serializable
|
public class DogTable2 implements Serializable
|
||||||
|
|
|
@ -21,9 +21,6 @@ package org.apache.openjpa.persistence.generationtype;
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
import javax.persistence.*;
|
import javax.persistence.*;
|
||||||
|
|
||||||
/**
|
|
||||||
* Extension of Animal class illustrating inheritance.
|
|
||||||
*/
|
|
||||||
@Entity(name = "DogTable3")
|
@Entity(name = "DogTable3")
|
||||||
@Table(name = "DOGTABLES", schema = "SCHEMA3")
|
@Table(name = "DOGTABLES", schema = "SCHEMA3")
|
||||||
public class DogTable3 implements Serializable
|
public class DogTable3 implements Serializable
|
||||||
|
|
|
@ -21,9 +21,6 @@ package org.apache.openjpa.persistence.generationtype;
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
import javax.persistence.*;
|
import javax.persistence.*;
|
||||||
|
|
||||||
/**
|
|
||||||
* Extension of Animal class illustrating inheritance.
|
|
||||||
*/
|
|
||||||
@Entity(name = "DogTable4")
|
@Entity(name = "DogTable4")
|
||||||
@Table(name = "DOGTABLES4")
|
@Table(name = "DOGTABLES4")
|
||||||
public class DogTable4 implements Serializable
|
public class DogTable4 implements Serializable
|
||||||
|
|
|
@ -19,15 +19,31 @@
|
||||||
package org.apache.openjpa.persistence.generationtype;
|
package org.apache.openjpa.persistence.generationtype;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import javax.persistence.EntityManager;
|
import javax.persistence.EntityManager;
|
||||||
|
import javax.persistence.PersistenceException;
|
||||||
import javax.persistence.Query;
|
import javax.persistence.Query;
|
||||||
import org.apache.openjpa.persistence.*;
|
|
||||||
|
import org.apache.openjpa.jdbc.conf.JDBCConfiguration;
|
||||||
|
import org.apache.openjpa.jdbc.sql.DBDictionary;
|
||||||
|
import org.apache.openjpa.jdbc.sql.PostgresDictionary;
|
||||||
|
import org.apache.openjpa.persistence.OpenJPAEntityManager;
|
||||||
|
import org.apache.openjpa.persistence.OpenJPAEntityManagerFactorySPI;
|
||||||
|
import org.apache.openjpa.persistence.OpenJPAEntityManagerSPI;
|
||||||
|
import org.apache.openjpa.persistence.OpenJPAPersistence;
|
||||||
import org.apache.openjpa.persistence.test.SingleEMFTestCase;
|
import org.apache.openjpa.persistence.test.SingleEMFTestCase;
|
||||||
|
|
||||||
public class TestMultipleSchemaNames extends SingleEMFTestCase {
|
public class TestMultipleSchemaNames extends SingleEMFTestCase {
|
||||||
|
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
setUp(Dog1.class, Dog2.class, DogTable.class, DogTable2.class,
|
// Create schemas when database requires this and we are about
|
||||||
DogTable3.class, DogTable4.class);
|
// to execute the first test.
|
||||||
|
if ("testGeneratedAUTO".equals(getName())) {
|
||||||
|
createSchemas();
|
||||||
|
}
|
||||||
|
|
||||||
|
setUp(Dog1.class, Dog2.class, Dog3.class, Dog4.class,
|
||||||
|
DogTable.class, DogTable2.class, DogTable3.class, DogTable4.class);
|
||||||
|
|
||||||
EntityManager em = emf.createEntityManager();
|
EntityManager em = emf.createEntityManager();
|
||||||
em.getTransaction().begin();
|
em.getTransaction().begin();
|
||||||
|
@ -77,6 +93,22 @@ public class TestMultipleSchemaNames extends SingleEMFTestCase {
|
||||||
em.remove(Obj);
|
em.remove(Obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Query qry7 = em.createQuery("select d from Dog3 d");
|
||||||
|
List result7 = qry7.getResultList();
|
||||||
|
|
||||||
|
for (int index = 0; index < result7.size(); index++) {
|
||||||
|
Dog3 Obj = (Dog3) result7.get(index);
|
||||||
|
em.remove(Obj);
|
||||||
|
}
|
||||||
|
|
||||||
|
Query qry8 = em.createQuery("select d from Dog4 d");
|
||||||
|
List result8 = qry8.getResultList();
|
||||||
|
|
||||||
|
for (int index = 0; index < result8.size(); index++) {
|
||||||
|
Dog4 Obj = (Dog4) result8.get(index);
|
||||||
|
em.remove(Obj);
|
||||||
|
}
|
||||||
|
|
||||||
Query delschema1 = em
|
Query delschema1 = em
|
||||||
.createNativeQuery("delete from schema1.openjpa_sequence_table");
|
.createNativeQuery("delete from schema1.openjpa_sequence_table");
|
||||||
delschema1.executeUpdate();
|
delschema1.executeUpdate();
|
||||||
|
@ -321,4 +353,83 @@ public class TestMultipleSchemaNames extends SingleEMFTestCase {
|
||||||
em.getTransaction().commit();
|
em.getTransaction().commit();
|
||||||
em.close();
|
em.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testGeneratedIDENTITY() {
|
||||||
|
EntityManager em = emf.createEntityManager();
|
||||||
|
OpenJPAEntityManager kem = OpenJPAPersistence.cast(em);
|
||||||
|
|
||||||
|
// Dog3 is a schema dog.
|
||||||
|
em.getTransaction().begin();
|
||||||
|
Dog3 dog30 = new Dog3();
|
||||||
|
dog30.setName("Dog30");
|
||||||
|
em.persist(dog30);
|
||||||
|
|
||||||
|
Dog3 dog31 = new Dog3();
|
||||||
|
dog31.setName("Dog31");
|
||||||
|
em.persist(dog31);
|
||||||
|
em.getTransaction().commit();
|
||||||
|
|
||||||
|
// We can't assume generated values start with 1 as
|
||||||
|
// the table might have already existed and had some rows.
|
||||||
|
Dog3 dog30x = em.find(Dog3.class, kem.getObjectId(dog30));
|
||||||
|
Dog3 dog31x = em.find(Dog3.class, kem.getObjectId(dog31));
|
||||||
|
assertTrue((dog30x.getId() + 1 == dog31x.getId()) ||
|
||||||
|
(dog30x.getId() == dog31x.getId() + 1));
|
||||||
|
assertEquals(dog30x.getName(), "Dog30");
|
||||||
|
|
||||||
|
// Dog4 is a non-schema dog.
|
||||||
|
em.getTransaction().begin();
|
||||||
|
Dog4 dog40 = new Dog4();
|
||||||
|
dog40.setName("Dog40");
|
||||||
|
em.persist(dog40);
|
||||||
|
|
||||||
|
Dog4 dog41 = new Dog4();
|
||||||
|
dog41.setName("Dog41");
|
||||||
|
em.persist(dog41);
|
||||||
|
em.getTransaction().commit();
|
||||||
|
|
||||||
|
Dog4 dog40x = em.find(Dog4.class, kem.getObjectId(dog40));
|
||||||
|
Dog4 dog41x = em.find(Dog4.class, kem.getObjectId(dog41));
|
||||||
|
assertTrue((dog40x.getId() + 1 == dog41x.getId()) ||
|
||||||
|
(dog40x.getId() == dog41x.getId() + 1));
|
||||||
|
assertEquals(dog40x.getName(), "Dog40");
|
||||||
|
|
||||||
|
em.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create necessary schemas if running on PostgreSQL as it does
|
||||||
|
* not create them automatically.
|
||||||
|
* Oracle and MySQL also don't create schemas automatically but
|
||||||
|
* we give up as they treat schemas in special ways.
|
||||||
|
*/
|
||||||
|
private void createSchemas() {
|
||||||
|
OpenJPAEntityManagerFactorySPI emf = createEMF();
|
||||||
|
OpenJPAEntityManagerSPI em = emf.createEntityManager();
|
||||||
|
DBDictionary dict = ((JDBCConfiguration) em.getConfiguration())
|
||||||
|
.getDBDictionaryInstance();
|
||||||
|
|
||||||
|
if (!(dict instanceof PostgresDictionary)) {
|
||||||
|
closeEMF(emf);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
String[] schemas =
|
||||||
|
{ "SCHEMA1", "SCHEMA2", "SCHEMA3", "SCHEMA3G", "SCHEMA4G" };
|
||||||
|
for (String schema : schemas) {
|
||||||
|
try {
|
||||||
|
em.getTransaction().begin();
|
||||||
|
Query q = em.createNativeQuery("create schema " + schema);
|
||||||
|
q.executeUpdate();
|
||||||
|
em.getTransaction().commit();
|
||||||
|
} catch (PersistenceException e) {
|
||||||
|
System.err.println("Exception caught while creating schema "
|
||||||
|
+ schema + ". Schema already exists? Message: "
|
||||||
|
+ e.getMessage());
|
||||||
|
em.getTransaction().rollback();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
closeEMF(emf);
|
||||||
|
}
|
||||||
|
|
||||||
} // end of TestMultipleSchemaNames
|
} // end of TestMultipleSchemaNames
|
||||||
|
|
Loading…
Reference in New Issue