OPENJPA-399 committing Teresa's patch

git-svn-id: https://svn.apache.org/repos/asf/openjpa/trunk@584330 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Michael Dick 2007-10-12 23:42:34 +00:00
parent 31e436df3c
commit 151cf2d034
15 changed files with 909 additions and 35 deletions

View File

@ -24,11 +24,13 @@ import java.sql.PreparedStatement;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.sql.Types; import java.sql.Types;
import java.util.HashMap;
import org.apache.openjpa.jdbc.conf.JDBCConfiguration; import org.apache.openjpa.jdbc.conf.JDBCConfiguration;
import org.apache.openjpa.jdbc.conf.JDBCConfigurationImpl; import org.apache.openjpa.jdbc.conf.JDBCConfigurationImpl;
import org.apache.openjpa.jdbc.meta.ClassMapping; import org.apache.openjpa.jdbc.meta.ClassMapping;
import org.apache.openjpa.jdbc.schema.Column; import org.apache.openjpa.jdbc.schema.Column;
import org.apache.openjpa.jdbc.schema.Index;
import org.apache.openjpa.jdbc.schema.PrimaryKey; import org.apache.openjpa.jdbc.schema.PrimaryKey;
import org.apache.openjpa.jdbc.schema.Schema; import org.apache.openjpa.jdbc.schema.Schema;
import org.apache.openjpa.jdbc.schema.SchemaGroup; import org.apache.openjpa.jdbc.schema.SchemaGroup;
@ -77,7 +79,7 @@ public class TableJDBCSeq
private transient Log _log = null; private transient Log _log = null;
private int _alloc = 50; private int _alloc = 50;
private int _intValue = 1; private int _intValue = 1;
private final Status _stat = new Status(); private final HashMap _stat = new HashMap();
private String _table = "OPENJPA_SEQUENCE_TABLE"; private String _table = "OPENJPA_SEQUENCE_TABLE";
private String _seqColumnName = "SEQUENCE_VALUE"; private String _seqColumnName = "SEQUENCE_VALUE";
@ -85,6 +87,7 @@ public class TableJDBCSeq
private Column _seqColumn = null; private Column _seqColumn = null;
private Column _pkColumn = null; private Column _pkColumn = null;
private int _schemasIdx = 0;
/** /**
* The sequence table name. Defaults to <code>OPENJPA_SEQUENCE_TABLE</code>. * The sequence table name. Defaults to <code>OPENJPA_SEQUENCE_TABLE</code>.
@ -212,20 +215,37 @@ public class TableJDBCSeq
buildTable(); buildTable();
} }
public void addSchema(ClassMapping mapping, SchemaGroup group) {
// table already exists?
if (group.isKnownTable(_table))
return;
public void addSchema(ClassMapping mapping, SchemaGroup group) {
// Since the table is created by openjpa internally
// we can create the table for each schema within the PU
// in here.
Schema[] schemas = group.getSchemas();
for (int i = 0; i < schemas.length; i++) {
String schemaName = Strings.getPackageName(_table); String schemaName = Strings.getPackageName(_table);
if (schemaName.length() == 0) if (schemaName.length() == 0)
schemaName = Schemas.getNewTableSchema(_conf); schemaName = Schemas.getNewTableSchema(_conf);
if (schemaName == null)
schemaName = schemas[i].getName();
// create table in this group // create table in this group
Schema schema = group.getSchema(schemaName); Schema schema = group.getSchema(schemaName);
if (schema == null) if (schema == null)
schema = group.addSchema(schemaName); schema = group.addSchema(schemaName);
schema.importTable(_pkColumn.getTable()); schema.importTable(_pkColumn.getTable());
// build the index for the sequence tables
// the index name will the fully qualified table name +_IDX
Table tab = schema.getTable(_table);
Index idx = tab.addIndex(tab.getFullName()+"_IDX");
idx.setUnique(true);
// we need to reset the table name in the column with the
// fully qualified name for matching the table name from the
// Column.
_pkColumn.resetTableName(schemaName+"."+_pkColumn.getTableName());
idx.addColumn(_pkColumn);
}
} }
protected Object nextInternal(JDBCStore store, ClassMapping mapping) protected Object nextInternal(JDBCStore store, ClassMapping mapping)
@ -286,7 +306,13 @@ public class TableJDBCSeq
* if cannot handle the given class. The mapping may be null. * if cannot handle the given class. The mapping may be null.
*/ */
protected Status getStatus(ClassMapping mapping) { protected Status getStatus(ClassMapping mapping) {
return _stat; Status status = (Status)_stat.get(mapping);
if (status == null){
status = new Status();
_stat.put(mapping, status);
}
return status;
} }
/** /**
@ -392,8 +418,9 @@ public class TableJDBCSeq
getClass(), mapping)); getClass(), mapping));
DBDictionary dict = _conf.getDBDictionaryInstance(); DBDictionary dict = _conf.getDBDictionaryInstance();
String tableName = resolveTableName(mapping, _pkColumn.getTable());
SQLBuffer insert = new SQLBuffer(dict).append("INSERT INTO "). SQLBuffer insert = new SQLBuffer(dict).append("INSERT INTO ").
append(_pkColumn.getTable()).append(" ("). append(tableName).append(" (").
append(_pkColumn).append(", ").append(_seqColumn). append(_pkColumn).append(", ").append(_seqColumn).
append(") VALUES ("). append(") VALUES (").
appendValue(pk, _pkColumn).append(", "). appendValue(pk, _pkColumn).append(", ").
@ -431,7 +458,8 @@ public class TableJDBCSeq
SQLBuffer sel = new SQLBuffer(dict).append(_seqColumn); SQLBuffer sel = new SQLBuffer(dict).append(_seqColumn);
SQLBuffer where = new SQLBuffer(dict).append(_pkColumn).append(" = "). SQLBuffer where = new SQLBuffer(dict).append(_pkColumn).append(" = ").
appendValue(pk, _pkColumn); appendValue(pk, _pkColumn);
SQLBuffer tables = new SQLBuffer(dict).append(_seqColumn.getTable()); String tableName = resolveTableName(mapping, _seqColumn.getTable());
SQLBuffer tables = new SQLBuffer(dict).append(tableName);
SQLBuffer select = dict.toSelect(sel, null, tables, where, null, SQLBuffer select = dict.toSelect(sel, null, tables, where, null,
null, null, false, dict.supportsSelectForUpdate, 0, Long.MAX_VALUE); null, null, false, dict.supportsSelectForUpdate, 0, Long.MAX_VALUE);
@ -486,7 +514,8 @@ public class TableJDBCSeq
// update the value // update the value
upd = new SQLBuffer(dict); upd = new SQLBuffer(dict);
upd.append("UPDATE ").append(_seqColumn.getTable()). String tableName = resolveTableName(mapping, _seqColumn.getTable());
upd.append("UPDATE ").append(tableName).
append(" SET ").append(_seqColumn).append(" = "). append(" SET ").append(_seqColumn).append(" = ").
appendValue(Numbers.valueOf(cur + inc), _seqColumn). appendValue(Numbers.valueOf(cur + inc), _seqColumn).
append(" WHERE ").append(where).append(" AND "). append(" WHERE ").append(where).append(" AND ").
@ -512,6 +541,21 @@ public class TableJDBCSeq
} }
return true; return true;
} }
/**
* Resolve a fully qualified table name
*
* @param class
* mapping to get the schema name
*/
public String resolveTableName(ClassMapping mapping, Table table) {
String sName = mapping.getTable().getSchemaName();
String tableName;
if (sName == null)
tableName = table.getFullName();
else
tableName = sName + "." + table.getFullName();
return tableName;
}
/** /**
* Creates the sequence table in the DB. * Creates the sequence table in the DB.

View File

@ -181,6 +181,14 @@ public class Column
_fullName = null; _fullName = null;
} }
/**
* Reset the table name with the fully qualified table name which
* includes the schema name
*/
public void resetTableName(String name) {
_tableName = name;
}
/** /**
* The column's schema name. * The column's schema name.
*/ */

View File

@ -93,11 +93,6 @@ public abstract class LocalConstraint
* Add a column to the constraint. * Add a column to the constraint.
*/ */
public void addColumn(Column col) { public void addColumn(Column col) {
if (col == null || !ObjectUtils.equals(col.getTable(), getTable()))
throw new InvalidStateException(_loc.get("table-mismatch",
col == null ? null : col.getTable(),
col == null ? null : getTable()));
if (_colList == null) if (_colList == null)
_colList = new ArrayList(3); _colList = new ArrayList(3);
else if (_colList.contains(col)) else if (_colList.contains(col))

View File

@ -186,6 +186,42 @@ public class SchemaGroup
return null; return null;
} }
/**
* Find the table with the given name in the group, using '.' as the catalog
* separator. Returns null if no table found.
*/
public Table findTable(Schema inSchema, String name) {
if (name == null)
return null;
int dotIdx = name.indexOf('.');
if (dotIdx != -1) {
String schemaName = name.substring(0, dotIdx);
name = name.substring(dotIdx + 1);
Schema schema = getSchema(schemaName);
if (schema != null)
return schema.getTable(name);
} else {
Schema[] schemas = getSchemas();
for (int i = 0; i < schemas.length; i++) {
Table tab = schemas[i].getTable(name);
// if a table is found and it has the same schema
// as the input schema , it means that the table
// exists. However, if the input schema is null,
// then we assume that there is only one table for the
// db default schema, in this case, table exists..
// We can't handle the case that one entity has schema name
// and other entity does not have schema name but both entities
// map to the same table.
if (tab != null
&& (schemas[i] == inSchema || inSchema.getName() == null))
return tab;
}
}
return null;
}
/** /**
* Return true if the given sequence is known to exist. While * Return true if the given sequence is known to exist. While
* {@link #findSequence} may exhibit dynamic behavior in some schema group * {@link #findSequence} may exhibit dynamic behavior in some schema group
@ -242,8 +278,37 @@ public class SchemaGroup
} }
/** /**
* Find all foreign keys exported by a given primary key (all foreign * Find the sequence with the given name in the group, using '.' as the
* keys that link to the primary key). * catalog separator. Returns null if no sequence found.
*/
public Sequence findSequence(Schema inSchema, String name) {
if (name == null)
return null;
int dotIdx = name.indexOf('.');
if (dotIdx != -1) {
String schemaName = name.substring(0, dotIdx);
name = name.substring(dotIdx + 1);
Schema schema = getSchema(schemaName);
if (schema != null)
return schema.getSequence(name);
} else {
Schema[] schemas = getSchemas();
Sequence seq;
for (int i = 0; i < schemas.length; i++) {
seq = schemas[i].getSequence(name);
if ((seq != null)
&& (schemas[i] == inSchema || inSchema.getName() == null))
return seq;
}
}
return null;
}
/**
* Find all foreign keys exported by a given primary key (all foreign keys
* that link to the primary key).
*/ */
public ForeignKey[] findExportedForeignKeys(PrimaryKey pk) { public ForeignKey[] findExportedForeignKeys(PrimaryKey pk) {
if (pk == null) if (pk == null)

View File

@ -450,7 +450,7 @@ public class SchemaTool {
for (int i = 0; i < schemas.length; i++) { for (int i = 0; i < schemas.length; i++) {
seqs = schemas[i].getSequences(); seqs = schemas[i].getSequences();
for (int j = 0; j < seqs.length; j++) { for (int j = 0; j < seqs.length; j++) {
if (db.findSequence(seqs[j]) != null) if (db.findSequence(schemas[i], seqs[j].getFullName()) != null)
continue; continue;
if (createSequence(seqs[j])) { if (createSequence(seqs[j])) {
@ -473,7 +473,7 @@ public class SchemaTool {
tabs = schemas[i].getTables(); tabs = schemas[i].getTables();
for (int j = 0; j < tabs.length; j++) { for (int j = 0; j < tabs.length; j++) {
cols = tabs[j].getColumns(); cols = tabs[j].getColumns();
dbTable = db.findTable(tabs[j]); dbTable = db.findTable(schemas[i], tabs[j].getFullName());
for (int k = 0; k < cols.length; k++) { for (int k = 0; k < cols.length; k++) {
if (dbTable != null) { if (dbTable != null) {
col = dbTable.getColumn(cols[k].getName()); col = dbTable.getColumn(cols[k].getName());
@ -500,7 +500,7 @@ public class SchemaTool {
tabs = schemas[i].getTables(); tabs = schemas[i].getTables();
for (int j = 0; j < tabs.length; j++) { for (int j = 0; j < tabs.length; j++) {
pk = tabs[j].getPrimaryKey(); pk = tabs[j].getPrimaryKey();
dbTable = db.findTable(tabs[j]); dbTable = db.findTable(schemas[i], tabs[j].getFullName());
if (pk != null && !pk.isLogical() && dbTable != null) { if (pk != null && !pk.isLogical() && dbTable != null) {
if (dbTable.getPrimaryKey() == null if (dbTable.getPrimaryKey() == null
&& addPrimaryKey(pk)) && addPrimaryKey(pk))
@ -520,7 +520,7 @@ public class SchemaTool {
for (int i = 0; i < schemas.length; i++) { for (int i = 0; i < schemas.length; i++) {
tabs = schemas[i].getTables(); tabs = schemas[i].getTables();
for (int j = 0; j < tabs.length; j++) { for (int j = 0; j < tabs.length; j++) {
if (db.findTable(tabs[j]) != null) if (db.findTable(schemas[i], tabs[j].getFullName()) != null)
continue; continue;
if (createTable(tabs[j])) { if (createTable(tabs[j])) {
@ -546,7 +546,7 @@ public class SchemaTool {
continue; continue;
idxs = tabs[j].getIndexes(); idxs = tabs[j].getIndexes();
dbTable = db.findTable(tabs[j]); dbTable = db.findTable(schemas[i], tabs[j].getFullName());
for (int k = 0; k < idxs.length; k++) { for (int k = 0; k < idxs.length; k++) {
if (dbTable != null) { if (dbTable != null) {
idx = findIndex(dbTable, idxs[k]); idx = findIndex(dbTable, idxs[k]);
@ -596,7 +596,7 @@ public class SchemaTool {
continue; continue;
fks = tabs[j].getForeignKeys(); fks = tabs[j].getForeignKeys();
dbTable = db.findTable(tabs[j]); dbTable = db.findTable(schemas[i],tabs[j].getFullName());
for (int k = 0; k < fks.length; k++) { for (int k = 0; k < fks.length; k++) {
if (!fks[k].isLogical() && dbTable != null) { if (!fks[k].isLogical() && dbTable != null) {
fk = findForeignKey(dbTable, fks[k]); fk = findForeignKey(dbTable, fks[k]);

View File

@ -498,7 +498,7 @@ public class Table
* Return the table's indexes. * Return the table's indexes.
*/ */
public Index[] getIndexes() { public Index[] getIndexes() {
if (_idxs == null) if (_idxs == null || _idxs.length == 0)
_idxs = (_idxMap == null) ? Schemas.EMPTY_INDEXES : (Index[]) _idxs = (_idxMap == null) ? Schemas.EMPTY_INDEXES : (Index[])
_idxMap.values().toArray(new Index[_idxMap.size()]); _idxMap.values().toArray(new Index[_idxMap.size()]);
return _idxs; return _idxs;

View File

@ -0,0 +1,96 @@
/*
* 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.*;
import java.io.*;
/**
* Extension of Animal class illustrating inheritance.
*/
@Entity(name = "Dog1")
@Table(name = "DOGTAB", schema = "SCHEMA1")
@IdClass(DogId.class)
public class Dog1 implements Serializable
{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id2;
@Id
private int datastoreid;
private String name;
private float price;
private boolean domestic;
public Dog1() {
super();
}
public Dog1(String name) {
this.id2 = id2;
this.name = name;
}
public int getId2() {
return id2;
}
public void setId2(int id) {
this.id2 = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
public boolean isDomestic() {
return domestic;
}
public void setDomestic(boolean domestic) {
this.domestic = domestic;
}
public int getDatastoreid() {
return datastoreid;
}
public void setDatastoreid(int datastoreid) {
this.datastoreid = datastoreid;
}
}

View File

@ -0,0 +1,96 @@
/*
* 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.*;
import java.io.*;
/**
* Extension of Animal class illustrating inheritance.
*/
@Entity(name = "Dog2")
@Table(name = "DOGTAB", schema = "SCHEMA2")
@IdClass(DogId.class)
public class Dog2 implements Serializable
{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id2;
@Id
private int datastoreid;
private String name;
private float price;
private boolean domestic;
public Dog2() {
super();
}
public Dog2(String name) {
this.id2 = id2;
this.name = name;
}
public int getId2() {
return id2;
}
public void setId2(int id) {
this.id2 = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
public boolean isDomestic() {
return domestic;
}
public void setDomestic(boolean domestic) {
this.domestic = domestic;
}
public int getDatastoreid() {
return datastoreid;
}
public void setDatastoreid(int datastoreid) {
this.datastoreid = datastoreid;
}
}

View File

@ -0,0 +1,103 @@
/*
* 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 java.io.*;
/**
* Application identity class for: tutorial.ejb.Animal
*
* Auto-generated by: org.apache.openjpa.enhance.ApplicationIdTool
*/
public class DogId implements Serializable {
static {
// register persistent class in JVM
try {
Class.forName("tutorial.ejb.Dog");
} catch (Exception e) {
}
}
public int id2;
public int datastoreid;
public DogId() {
}
public DogId(String str) {
fromString(str);
}
public String toString() {
return String.valueOf(id2) + "::" + datastoreid;
}
public int hashCode() {
int rs = 17;
rs = rs * 37 + (int) (id2 ^ (id2 >>> 32));
rs = rs
* 37
+ ((datastoreid == 0) ? 0 : new Integer(datastoreid).hashCode());
return rs;
}
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null || obj.getClass() != getClass())
return false;
DogId other = (DogId) obj;
return (id2 == other.id2)
&& ((datastoreid == 0 && other.datastoreid == 0) || (datastoreid != 0 && datastoreid == other.datastoreid));
}
private void fromString(String str) {
Tokenizer toke = new Tokenizer(str);
str = toke.nextToken();
id2 = Integer.parseInt(str);
str = toke.nextToken();
datastoreid = Integer.parseInt(str);
}
protected static class Tokenizer {
private final String str;
private int last;
public Tokenizer(String str) {
this.str = str;
}
public String nextToken() {
int next = str.indexOf("::", last);
String part;
if (next == -1) {
part = str.substring(last);
last = str.length();
} else {
part = str.substring(last, next);
last = next + 2;
}
return part;
}
}
}

View File

@ -0,0 +1,101 @@
/*
* 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.*;
import java.io.*;
/**
* Extension of Animal class illustrating inheritance.
*/
@Entity(name = "DogTable")
@Table(name = "DOGTABLE", schema = "SCHEMA1")
@IdClass(DogId.class)
public class DogTable implements Serializable
{
@Id
@TableGenerator(name = "Dog_Gen1", table = "ID_Gen1",
pkColumnName = "GEN_NAME", valueColumnName = "GEN_VAL",
pkColumnValue = "ID2", initialValue = 20, allocationSize = 10)
@GeneratedValue(strategy = GenerationType.TABLE, generator = "Dog_Gen1")
private int id2;
@Id
private int datastoreid;
private String name;
private float price;
private boolean domestic;
public DogTable() {
super();
}
public DogTable(String name) {
this.id2 = id2;
this.name = name;
}
public int getId2() {
return id2;
}
public void setId2(int id) {
this.id2 = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
public boolean isDomestic() {
return domestic;
}
public void setDomestic(boolean domestic) {
this.domestic = domestic;
}
public int getDatastoreid() {
return datastoreid;
}
public void setDatastoreid(int datastoreid) {
this.datastoreid = datastoreid;
}
}

View File

@ -0,0 +1,100 @@
/*
* 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 java.io.*;
import javax.persistence.*;
/**
* Extension of Animal class illustrating inheritance.
*/
@Entity(name = "DogTable2")
@Table(name = "DOGTABLE", schema = "SCHEMA2")
@IdClass(DogId.class)
public class DogTable2 implements Serializable
{
@Id
@TableGenerator(name = "Dog_Gen2", table = "ID_Gen2",
pkColumnName = "GEN_NAME", valueColumnName = "GEN_VAL",
pkColumnValue = "ID2", initialValue = 100, allocationSize = 10)
@GeneratedValue(strategy = GenerationType.TABLE, generator = "Dog_Gen2")
private int id2;
@Id
private int datastoreid;
private String name;
private float price;
private boolean domestic;
public DogTable2() {
super();
}
public DogTable2(String name) {
this.id2 = id2;
this.name = name;
}
public int getId2() {
return id2;
}
public void setId2(int id) {
this.id2 = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
public boolean isDomestic() {
return domestic;
}
public void setDomestic(boolean domestic) {
this.domestic = domestic;
}
public int getDatastoreid() {
return datastoreid;
}
public void setDatastoreid(int datastoreid) {
this.datastoreid = datastoreid;
}
}

View File

@ -0,0 +1,237 @@
/*
* 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 java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import org.apache.openjpa.persistence.*;
import org.apache.openjpa.persistence.test.SingleEMFTestCase;
public class TestMultipleSchemaNames extends SingleEMFTestCase {
public void setUp() {
setUp(Dog1.class, Dog2.class, DogTable.class, DogTable2.class);
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
// cleanup database first
Query qry = em.createQuery("select d from Dog1 d");
List result = qry.getResultList();
for (int index = 0; index < result.size(); index++) {
Dog1 Obj = (Dog1) result.get(index);
em.remove(Obj);
}
Query qry2 = em.createQuery("select d from Dog2 d");
List result2 = qry2.getResultList();
for (int index = 0; index < result2.size(); index++) {
Dog2 Obj = (Dog2) result2.get(index);
em.remove(Obj);
}
Query qry3 = em.createQuery("select d from DogTable d");
List result3 = qry3.getResultList();
for (int index = 0; index < result3.size(); index++) {
DogTable Obj = (DogTable) result3.get(index);
em.remove(Obj);
}
Query qry4 = em.createQuery("select d from DogTable2 d");
List result4 = qry4.getResultList();
for (int index = 0; index < result4.size(); index++) {
DogTable2 Obj = (DogTable2) result4.get(index);
em.remove(Obj);
}
Query delschema1 = em
.createNativeQuery("delete from schema1.openjpa_sequence_table");
delschema1.executeUpdate();
Query delschema2 = em
.createNativeQuery("delete from schema2.openjpa_sequence_table");
delschema2.executeUpdate();
Query delgentable = em.createNativeQuery("delete from schema1.id_gen1");
delgentable.executeUpdate();
Query delgentable2 = em
.createNativeQuery("delete from schema2.id_gen2");
delgentable2.executeUpdate();
em.getTransaction().commit();
}
public void testGeneratedAUTO() {
EntityManager em = emf.createEntityManager();
OpenJPAEntityManager kem = OpenJPAPersistence.cast(em);
em.getTransaction().begin();
Dog1 dog1 = new Dog1();
dog1.setName("helloDog1");
dog1.setDatastoreid(12);
dog1.setPrice(12000);
em.persist(dog1);
Dog1 dog1a = new Dog1();
dog1a.setName("helloDog2");
dog1a.setDatastoreid(15);
dog1a.setPrice(22000);
em.persist(dog1a);
// add dog2
Dog2 dog2 = new Dog2();
dog2.setName("helloDog3");
dog2.setDatastoreid(12);
dog2.setPrice(15000);
em.persist(dog2);
Dog2 dog2a = new Dog2();
dog2a.setName("helloDog4");
dog2a.setDatastoreid(19);
dog2a.setPrice(25000);
em.persist(dog2a);
em.getTransaction().commit();
// System.out.println("persist dogs are done");
Dog1 dog1x = em.find(Dog1.class, kem.getObjectId(dog1));
assertTrue(dog1x.getId2() == 1 || dog1x.getId2() == 2);
assertEquals(dog1x.getName(), "helloDog1");
dog1x.setName("Dog1");
dog1x.setDomestic(true);
Dog1 dog11 = em.find(Dog1.class, kem.getObjectId(dog1a));
assertTrue(dog11.getId2() == 1 || dog11.getId2() == 2);
assertEquals(dog11.getName(), "helloDog2");
dog11.setName("Dog2");
dog11.setDomestic(true);
// update dog2
Dog2 dog2x = em.find(Dog2.class, kem.getObjectId(dog2));
assertTrue(dog2x.getId2() == 1 || dog2x.getId2() == 2);
assertEquals(dog2x.getName(), "helloDog3");
dog2x.setName("Dog3");
dog2x.setDomestic(true);
Dog2 dog21 = em.find(Dog2.class, kem.getObjectId(dog2a));
assertTrue(dog21.getId2() == 1 || dog21.getId2() == 2);
assertEquals(dog21.getName(), "helloDog4");
dog21.setName("Dog4");
dog21.setDomestic(true);
// get the update dog name
em.getTransaction().begin();
Query qry1 = em.createQuery("select d from Dog1 d order by d.name");
List result1 = qry1.getResultList();
for (int index = 0; index < result1.size(); index++) {
Dog1 dog4 = (Dog1) result1.get(index);
int i = index + 1;
assertTrue(dog4.getId2() == 1 || dog4.getId2() == 2);
assertEquals(dog4.getName(), "Dog" + i);
}
Query qry2 = em.createQuery("select d from Dog2 d order by d.name");
List result2 = qry2.getResultList();
for (int index = 0; index < result2.size(); index++) {
Dog2 dog5 = (Dog2) result2.get(index);
assertTrue(dog5.getId2() == 1 || dog5.getId2() == 2);
int j = index + 3;
assertEquals(dog5.getName(), "Dog" + j);
}
em.getTransaction().commit();
em.close();
}
public void testGeneratedTABLE() {
EntityManager em = emf.createEntityManager();
OpenJPAEntityManager kem = OpenJPAPersistence.cast(em);
em.getTransaction().begin();
DogTable dog1 = new DogTable();
dog1.setName("helloDog1");
dog1.setDatastoreid(12);
dog1.setPrice(12000);
em.persist(dog1);
DogTable dog1a = new DogTable();
dog1a.setName("helloDog2");
dog1a.setDatastoreid(15);
dog1a.setPrice(22000);
em.persist(dog1a);
// add dog2
DogTable2 dog2 = new DogTable2();
dog2.setName("helloDog3");
dog2.setDatastoreid(12);
dog2.setPrice(15000);
em.persist(dog2);
DogTable2 dog2a = new DogTable2();
dog2a.setName("helloDog4");
dog2a.setDatastoreid(19);
dog2a.setPrice(25000);
em.persist(dog2a);
em.getTransaction().commit();
DogTable dog1x = em.find(DogTable.class, kem.getObjectId(dog1));
assertTrue(dog1x.getId2() == 20 || dog1x.getId2() == 21);
assertEquals(dog1x.getName(), "helloDog1");
dog1x.setName("Dog1");
dog1x.setDomestic(true);
DogTable dog11 = em.find(DogTable.class, kem.getObjectId(dog1a));
assertTrue(dog11.getId2() == 20 || dog11.getId2() == 21);
assertEquals(dog11.getName(), "helloDog2");
dog11.setName("Dog2");
dog11.setDomestic(true);
// update dog2
DogTable2 dog2x = em.find(DogTable2.class, kem.getObjectId(dog2));
assertTrue(dog2x.getId2() == 100 || dog2x.getId2() == 101);
assertEquals(dog2x.getName(), "helloDog3");
dog2x.setName("Dog3");
dog2x.setDomestic(true);
DogTable2 dog21 = em.find(DogTable2.class, kem.getObjectId(dog2a));
assertTrue(dog2x.getId2() == 100 || dog2x.getId2() == 101);
assertEquals(dog21.getName(), "helloDog4");
dog21.setName("Dog4");
dog21.setDomestic(true);
// get the update dog name
em.getTransaction().begin();
Query qry1 = em.createQuery("select d from DogTable d order by d.name");
List result1 = qry1.getResultList();
for (int index = 0; index < result1.size(); index++) {
DogTable dog4 = (DogTable) result1.get(index);
assertTrue(dog4.getId2() == 20 || dog4.getId2() == 21);
int j = index + 1;
assertEquals(dog4.getName(), "Dog" + j);
}
Query qry2 = em
.createQuery("select d from DogTable2 d order by d.name");
List result2 = qry2.getResultList();
for (int index = 0; index < result2.size(); index++) {
DogTable2 dog5 = (DogTable2) result2.get(index);
assertTrue(dog5.getId2() == 100 || dog5.getId2() == 101);
int j = index + 3;
assertEquals(dog5.getName(), "Dog" + j);
}
em.getTransaction().commit();
em.close();
}
} // end of TestMultipleSchemaNames

View File

@ -883,6 +883,19 @@ These string constants are defined in
<ulink url="../javadoc/org/apache/openjpa/persistence/Generator.html"> <ulink url="../javadoc/org/apache/openjpa/persistence/Generator.html">
<classname>org.apache.openjpa.persistence.Generator</classname></ulink>. <classname>org.apache.openjpa.persistence.Generator</classname></ulink>.
</para> </para>
<para>
If the entities are mapped to the same table name but with different schema
name within one <literal>PersistenceUnit</literal> intentionally, and the
strategy of <literal>GeneratedType.AUTO</literal> is used to generate the ID
for each entity, a schema name for each entity must be explicitly declared
either through the annotation or the mapping.xml file. Otherwise, the mapping
tool only creates the tables for those entities with the schema names under
each schema. In addition, there will be only one
<literal>OPENJPA_SEQUENCE_TABLE</literal> created for all the entities within
the <literal>PersistenceUnit</literal> if the entities are not identified
with the schema name. Read <xref linkend="ref_guide_sequence"/> and
<xref linkend="ref_guide_schema_def"/> in the Reference Guide.
</para>
</note> </note>
</section> </section>
<section id="jpa_overview_meta_embedid"> <section id="jpa_overview_meta_embedid">

View File

@ -3299,6 +3299,19 @@ The <literal>Schema</literal> property also establishes the default schema for
new tables created through OpenJPA tools, such as the mapping tool covered in new tables created through OpenJPA tools, such as the mapping tool covered in
<xref linkend="ref_guide_mapping_mappingtool"/>. <xref linkend="ref_guide_mapping_mappingtool"/>.
</para> </para>
<para>
If the entities are mapped to the same table name but with different schema
name within one <literal>PersistenceUnit</literal> intentionally, and the
strategy of <literal>GeneratedType.AUTO</literal> is used to generate the ID
for each entity, a schema name for each entity must be explicitly declared
either through the annotation or the mapping.xml file. Otherwise, the mapping
tool only creates the tables for those entities with the schema names under
each schema. In addition, there will be only one
<literal>OPENJPA_SEQUENCE_TABLE</literal> created for all the entities within
the <literal>PersistenceUnit</literal> if the entities are not identified
with the schema name.
Read <xref linkend="ref_guide_sequence"/> in the Reference Guide.
</para>
</section> </section>
<section id="ref_guide_schema_info"> <section id="ref_guide_schema_info">
<title> <title>

View File

@ -1455,7 +1455,10 @@ This <classname>Seq</classname> has the following properties:
<listitem> <listitem>
<para> <para>
<literal>Table</literal>: The name of the sequence number table to use. <literal>Table</literal>: The name of the sequence number table to use.
Defaults to <literal>OPENJPA_SEQUENCE_TABLE</literal>. Defaults to <literal>OPENJPA_SEQUENCE_TABLE</literal>. If the entities are
mapped to the same table name but with different schema name within one
PersistenceUnit, one <literal>OPENJPA_SEQUENCE_TABLE</literal> is created
for each schema.
</para> </para>
</listitem> </listitem>
<listitem> <listitem>