HHH-5662 - Import the initial work
This commit is contained in:
parent
960326510f
commit
6ea31ce779
|
@ -51,7 +51,11 @@ public abstract class AbstractConstraint implements Constraint {
|
||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<Column> getColumns() {
|
public Iterable<Column> getColumns() {
|
||||||
|
return columns;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected List<Column> internalColumnAccess() {
|
||||||
return columns;
|
return columns;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -23,6 +23,9 @@
|
||||||
*/
|
*/
|
||||||
package org.hibernate.metamodel.relational;
|
package org.hibernate.metamodel.relational;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Convenience base class for implementing the {@link ValueContainer} contract centralizing commonality
|
* Convenience base class for implementing the {@link ValueContainer} contract centralizing commonality
|
||||||
* between modelling tables views and inline views.
|
* between modelling tables views and inline views.
|
||||||
|
@ -31,6 +34,19 @@ package org.hibernate.metamodel.relational;
|
||||||
*/
|
*/
|
||||||
public abstract class AbstractTableSpecification extends AbstractValueContainer implements TableSpecification {
|
public abstract class AbstractTableSpecification extends AbstractValueContainer implements TableSpecification {
|
||||||
private PrimaryKey primaryKey = new PrimaryKey( this );
|
private PrimaryKey primaryKey = new PrimaryKey( this );
|
||||||
|
private List<ForeignKey> foreignKeys = new ArrayList<ForeignKey>();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Iterable<ForeignKey> getForeignKeys() {
|
||||||
|
return foreignKeys;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ForeignKey createForeignKey(TableSpecification targetTable, String name) {
|
||||||
|
ForeignKey fk = new ForeignKey( this, targetTable, name );
|
||||||
|
foreignKeys.add( fk );
|
||||||
|
return fk;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* {@inheritDoc}
|
* {@inheritDoc}
|
||||||
|
|
|
@ -34,7 +34,7 @@ public abstract class AbstractValueContainer implements ValueContainer {
|
||||||
private final LinkedHashSet<Value> values = new LinkedHashSet<Value>();
|
private final LinkedHashSet<Value> values = new LinkedHashSet<Value>();
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Iterable<Value> iterateValues() {
|
public Iterable<Value> values() {
|
||||||
return values;
|
return values;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -85,20 +85,36 @@ public class Column extends AbstractSimpleValue implements SimpleValue {
|
||||||
this.lobMultiplier = lobMultiplier;
|
this.lobMultiplier = lobMultiplier;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Size(int precision) {
|
public static Size precision(int precision) {
|
||||||
this( precision, -1, -1, null );
|
return new Size( precision, -1, -1, null );
|
||||||
}
|
}
|
||||||
|
|
||||||
public Size(int precision, int scale) {
|
public static Size precision(int precision, int scale) {
|
||||||
this( precision, scale, -1, null );
|
return new Size( precision, scale, -1, null );
|
||||||
}
|
}
|
||||||
|
|
||||||
public Size(long length) {
|
public static Size length(long length) {
|
||||||
this( -1, -1, length, null );
|
return new Size( -1, -1, length, null );
|
||||||
}
|
}
|
||||||
|
|
||||||
public Size(long length, LobMultiplier lobMultiplier) {
|
public static Size length(long length, LobMultiplier lobMultiplier) {
|
||||||
this( -1, -1, length, lobMultiplier );
|
return new Size( -1, -1, length, lobMultiplier );
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getPrecision() {
|
||||||
|
return precision;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getScale() {
|
||||||
|
return scale;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getLength() {
|
||||||
|
return length;
|
||||||
|
}
|
||||||
|
|
||||||
|
public LobMultiplier getLobMultiplier() {
|
||||||
|
return lobMultiplier;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -54,5 +54,5 @@ public interface Constraint {
|
||||||
*
|
*
|
||||||
* @return The constrained columns.
|
* @return The constrained columns.
|
||||||
*/
|
*/
|
||||||
public List<Column> getColumns();
|
public Iterable<Column> getColumns();
|
||||||
}
|
}
|
||||||
|
|
|
@ -44,12 +44,12 @@ public class ForeignKey extends AbstractConstraint implements Constraint, Export
|
||||||
private final TableSpecification targetTable;
|
private final TableSpecification targetTable;
|
||||||
private List<Column> targetColumns;
|
private List<Column> targetColumns;
|
||||||
|
|
||||||
public ForeignKey(TableSpecification sourceTable, TableSpecification targetTable, String name) {
|
protected ForeignKey(TableSpecification sourceTable, TableSpecification targetTable, String name) {
|
||||||
super( sourceTable, name );
|
super( sourceTable, name );
|
||||||
this.targetTable = targetTable;
|
this.targetTable = targetTable;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ForeignKey(TableSpecification sourceTable, TableSpecification targetTable) {
|
protected ForeignKey(TableSpecification sourceTable, TableSpecification targetTable) {
|
||||||
this( sourceTable, targetTable, null );
|
this( sourceTable, targetTable, null );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -61,16 +61,21 @@ public class ForeignKey extends AbstractConstraint implements Constraint, Export
|
||||||
return targetTable;
|
return targetTable;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<Column> getSourceColumns() {
|
public Iterable<Column> getSourceColumns() {
|
||||||
return getColumns();
|
return getColumns();
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<Column> getTargetColumns() {
|
public Iterable<Column> getTargetColumns() {
|
||||||
return targetColumns == null
|
return targetColumns == null
|
||||||
? getTargetTable().getPrimaryKey().getColumns()
|
? getTargetTable().getPrimaryKey().getColumns()
|
||||||
: targetColumns;
|
: targetColumns;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addColumn(Column column) {
|
||||||
|
addColumnMapping( column, null );
|
||||||
|
}
|
||||||
|
|
||||||
public void addColumnMapping(Column sourceColumn, Column targetColumn) {
|
public void addColumnMapping(Column sourceColumn, Column targetColumn) {
|
||||||
if ( targetColumn == null ) {
|
if ( targetColumn == null ) {
|
||||||
if ( targetColumns != null ) {
|
if ( targetColumns != null ) {
|
||||||
|
@ -85,7 +90,7 @@ public class ForeignKey extends AbstractConstraint implements Constraint, Export
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if ( targetColumns == null ) {
|
if ( targetColumns == null ) {
|
||||||
if ( !getSourceColumns().isEmpty() ) {
|
if ( !internalColumnAccess().isEmpty() ) {
|
||||||
log.warn(
|
log.warn(
|
||||||
"Value mapping mismatch as part of FK [table=" + getTable().toLoggableString()
|
"Value mapping mismatch as part of FK [table=" + getTable().toLoggableString()
|
||||||
+ ", name=" + getName() + "] while adding source column ["
|
+ ", name=" + getName() + "] while adding source column ["
|
||||||
|
@ -96,11 +101,17 @@ public class ForeignKey extends AbstractConstraint implements Constraint, Export
|
||||||
}
|
}
|
||||||
targetColumns.add( targetColumn );
|
targetColumns.add( targetColumn );
|
||||||
}
|
}
|
||||||
getSourceColumns().add( sourceColumn );
|
internalColumnAccess().add( sourceColumn );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getExportIdentifier() {
|
public String getExportIdentifier() {
|
||||||
return getSourceTable().getLoggableValueQualifier() + ".FK-" + getName();
|
return getSourceTable().getLoggableValueQualifier() + ".FK-" + getName();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void validate() {
|
||||||
|
if ( getSourceTable() == null ) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,7 +30,7 @@ package org.hibernate.metamodel.relational;
|
||||||
* @author Steve Ebersole
|
* @author Steve Ebersole
|
||||||
*/
|
*/
|
||||||
public class Index extends AbstractConstraint implements Constraint {
|
public class Index extends AbstractConstraint implements Constraint {
|
||||||
protected Index(TableSpecification table, String name) {
|
protected Index(Table table, String name) {
|
||||||
super( table, name );
|
super( table, name );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -37,9 +37,11 @@ public class PrimaryKey extends AbstractConstraint implements Constraint, Export
|
||||||
// (1) primary keys are not required to be named.
|
// (1) primary keys are not required to be named.
|
||||||
// (2) because a primary key is required for each table, it is easier to allow setting the constraint name
|
// (2) because a primary key is required for each table, it is easier to allow setting the constraint name
|
||||||
// later in terms of building the metamodel
|
// later in terms of building the metamodel
|
||||||
|
//
|
||||||
|
// todo : default name? {TABLE_NAME}_PK maybe?
|
||||||
private String name;
|
private String name;
|
||||||
|
|
||||||
public PrimaryKey(TableSpecification table) {
|
protected PrimaryKey(TableSpecification table) {
|
||||||
super( table, null );
|
super( table, null );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -23,6 +23,8 @@
|
||||||
*/
|
*/
|
||||||
package org.hibernate.metamodel.relational;
|
package org.hibernate.metamodel.relational;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -35,6 +37,9 @@ public class Table extends AbstractTableSpecification implements ValueContainer,
|
||||||
private final ObjectName name;
|
private final ObjectName name;
|
||||||
private final Set<ObjectName> spaces;
|
private final Set<ObjectName> spaces;
|
||||||
|
|
||||||
|
private List<Index> indexes;
|
||||||
|
private List<UniqueKey> uniqueKeys;
|
||||||
|
|
||||||
public Table(ObjectName name) {
|
public Table(ObjectName name) {
|
||||||
this.name = name;
|
this.name = name;
|
||||||
this.spaces = java.util.Collections.singleton( name );
|
this.spaces = java.util.Collections.singleton( name );
|
||||||
|
@ -55,7 +60,7 @@ public class Table extends AbstractTableSpecification implements ValueContainer,
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Set<ObjectName> getSpaces() {
|
public Iterable<ObjectName> getSpaces() {
|
||||||
return spaces;
|
return spaces;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -64,6 +69,24 @@ public class Table extends AbstractTableSpecification implements ValueContainer,
|
||||||
return getObjectName().getIdentifier();
|
return getObjectName().getIdentifier();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Index createIndex(String name) {
|
||||||
|
Index index = new Index( this, name );
|
||||||
|
if ( indexes == null ) {
|
||||||
|
indexes = new ArrayList<Index>();
|
||||||
|
}
|
||||||
|
indexes.add( index );
|
||||||
|
return index;
|
||||||
|
}
|
||||||
|
|
||||||
|
public UniqueKey createUniqueKey(String name) {
|
||||||
|
UniqueKey uniqueKey = new UniqueKey( this, name );
|
||||||
|
if ( uniqueKeys == null ) {
|
||||||
|
uniqueKeys = new ArrayList<UniqueKey>();
|
||||||
|
}
|
||||||
|
uniqueKeys.add( uniqueKey );
|
||||||
|
return uniqueKey;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return "Table{" +
|
return "Table{" +
|
||||||
|
|
|
@ -23,8 +23,6 @@
|
||||||
*/
|
*/
|
||||||
package org.hibernate.metamodel.relational;
|
package org.hibernate.metamodel.relational;
|
||||||
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Models what ANSI SQL terms a table specification which is a table or a view or an inline view.
|
* Models what ANSI SQL terms a table specification which is a table or a view or an inline view.
|
||||||
*
|
*
|
||||||
|
@ -38,10 +36,14 @@ public interface TableSpecification extends ValueContainer {
|
||||||
*/
|
*/
|
||||||
public PrimaryKey getPrimaryKey();
|
public PrimaryKey getPrimaryKey();
|
||||||
|
|
||||||
|
public ForeignKey createForeignKey(TableSpecification targetTable, String name);
|
||||||
|
|
||||||
|
public Iterable<ForeignKey> getForeignKeys();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the physical table names modelled here. This is especially important in the case of an inline view.
|
* Get the physical table names modelled here. This is especially important in the case of an inline view.
|
||||||
*
|
*
|
||||||
* @return The spaces.
|
* @return The spaces.
|
||||||
*/
|
*/
|
||||||
public Set<ObjectName> getSpaces();
|
public Iterable<ObjectName> getSpaces();
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,7 +30,7 @@ package org.hibernate.metamodel.relational;
|
||||||
* @author Steve Ebersole
|
* @author Steve Ebersole
|
||||||
*/
|
*/
|
||||||
public class UniqueKey extends AbstractConstraint implements Constraint {
|
public class UniqueKey extends AbstractConstraint implements Constraint {
|
||||||
protected UniqueKey(TableSpecification table, String name) {
|
protected UniqueKey(Table table, String name) {
|
||||||
super( table, name );
|
super( table, name );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,7 +36,7 @@ public interface ValueContainer {
|
||||||
*
|
*
|
||||||
* @return Iterator over value definitions.
|
* @return Iterator over value definitions.
|
||||||
*/
|
*/
|
||||||
public Iterable<Value> iterateValues();
|
public Iterable<Value> values();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a qualifier which can be used to qualify {@link Value values} belonging to this container in
|
* Get a qualifier which can be used to qualify {@link Value values} belonging to this container in
|
||||||
|
|
|
@ -0,0 +1,61 @@
|
||||||
|
/*
|
||||||
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* Copyright (c) 2010, Red Hat Inc. or third-party contributors as
|
||||||
|
* indicated by the @author tags or express copyright attribution
|
||||||
|
* statements applied by the authors. All third-party contributions are
|
||||||
|
* distributed under license by Red Hat Inc.
|
||||||
|
*
|
||||||
|
* This copyrighted material is made available to anyone wishing to use, modify,
|
||||||
|
* copy, or redistribute it subject to the terms and conditions of the GNU
|
||||||
|
* Lesser General Public License, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||||
|
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
||||||
|
* for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with this distribution; if not, write to:
|
||||||
|
* Free Software Foundation, Inc.
|
||||||
|
* 51 Franklin Street, Fifth Floor
|
||||||
|
* Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
package org.hibernate.metamodel.relational;
|
||||||
|
|
||||||
|
import org.hibernate.testing.junit.UnitTestCase;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* TODO : javadoc
|
||||||
|
*
|
||||||
|
* @author Steve Ebersole
|
||||||
|
*/
|
||||||
|
public class ObjectNameTests extends UnitTestCase {
|
||||||
|
public ObjectNameTests(String string) {
|
||||||
|
super( string );
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testMissingName() {
|
||||||
|
try {
|
||||||
|
new ObjectName( (String)null, null, null );
|
||||||
|
fail();
|
||||||
|
}
|
||||||
|
catch ( IllegalIdentifierException ignore ) {
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
new ObjectName( "schema", "catalog", null );
|
||||||
|
fail();
|
||||||
|
}
|
||||||
|
catch ( IllegalIdentifierException ignore ) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testIdentifierBuilding() {
|
||||||
|
ObjectName on = new ObjectName( "schema", "catalog", "name" );
|
||||||
|
assertEquals( "schema.catalog.name", on.getIdentifier() );
|
||||||
|
on = new ObjectName( "schema", null, "name" );
|
||||||
|
assertEquals( "schema.name", on.getIdentifier() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,111 @@
|
||||||
|
/*
|
||||||
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* Copyright (c) 2010, Red Hat Inc. or third-party contributors as
|
||||||
|
* indicated by the @author tags or express copyright attribution
|
||||||
|
* statements applied by the authors. All third-party contributions are
|
||||||
|
* distributed under license by Red Hat Inc.
|
||||||
|
*
|
||||||
|
* This copyrighted material is made available to anyone wishing to use, modify,
|
||||||
|
* copy, or redistribute it subject to the terms and conditions of the GNU
|
||||||
|
* Lesser General Public License, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||||
|
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
||||||
|
* for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with this distribution; if not, write to:
|
||||||
|
* Free Software Foundation, Inc.
|
||||||
|
* 51 Franklin Street, Fifth Floor
|
||||||
|
* Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
package org.hibernate.metamodel.relational;
|
||||||
|
|
||||||
|
import java.sql.Types;
|
||||||
|
|
||||||
|
import org.hibernate.testing.junit.UnitTestCase;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* TODO : javadoc
|
||||||
|
*
|
||||||
|
* @author Steve Ebersole
|
||||||
|
*/
|
||||||
|
public class TableManipulationTests extends UnitTestCase {
|
||||||
|
public static final Datatype VARCHAR = new Datatype( Types.VARCHAR, "VARCHAR", String.class );
|
||||||
|
public static final Datatype INTEGER = new Datatype( Types.INTEGER, "INTEGER", Long.class );
|
||||||
|
|
||||||
|
public TableManipulationTests(String string) {
|
||||||
|
super( string );
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testTableCreation() {
|
||||||
|
Table table = new Table( new ObjectName( null, null, "my_table" ) );
|
||||||
|
assertNull( table.getObjectName().getSchema() );
|
||||||
|
assertNull( table.getObjectName().getCatalog() );
|
||||||
|
assertEquals( "my_table", table.getObjectName().getName().toString() );
|
||||||
|
assertEquals( "my_table", table.getExportIdentifier() );
|
||||||
|
assertNull( table.getPrimaryKey().getName() );
|
||||||
|
assertFalse( table.values().iterator().hasNext() );
|
||||||
|
|
||||||
|
Column idColumn = table.createColumn( "id" );
|
||||||
|
idColumn.setDatatype( INTEGER );
|
||||||
|
idColumn.setSize( Column.Size.precision( 18, 0 ) );
|
||||||
|
table.getPrimaryKey().addColumn( idColumn );
|
||||||
|
table.getPrimaryKey().setName( "my_table_pk" );
|
||||||
|
assertEquals( "my_table_pk", table.getPrimaryKey().getName() );
|
||||||
|
assertEquals( "my_table.PK", table.getPrimaryKey().getExportIdentifier() );
|
||||||
|
|
||||||
|
Column col_1 = table.createColumn( "col_1" );
|
||||||
|
col_1.setDatatype( VARCHAR );
|
||||||
|
col_1.setSize( Column.Size.length( 512 ) );
|
||||||
|
|
||||||
|
for ( Value value : table.values() ) {
|
||||||
|
assertTrue( Column.class.isInstance( value ) );
|
||||||
|
Column column = ( Column ) value;
|
||||||
|
if ( column.getName().equals( "id" ) ) {
|
||||||
|
assertEquals( INTEGER, column.getDatatype() );
|
||||||
|
assertEquals( 18, column.getSize().getPrecision() );
|
||||||
|
assertEquals( 0, column.getSize().getScale() );
|
||||||
|
assertEquals( -1, column.getSize().getLength() );
|
||||||
|
assertNull( column.getSize().getLobMultiplier() );
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
assertEquals( "col_1", column.getName() );
|
||||||
|
assertEquals( VARCHAR, column.getDatatype() );
|
||||||
|
assertEquals( -1, column.getSize().getPrecision() );
|
||||||
|
assertEquals( -1, column.getSize().getScale() );
|
||||||
|
assertEquals( 512, column.getSize().getLength() );
|
||||||
|
assertNull( column.getSize().getLobMultiplier() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testBasicForeignKeyDefinition() {
|
||||||
|
Table book = new Table( new ObjectName( null, null, "BOOK" ) );
|
||||||
|
|
||||||
|
Column bookId = book.createColumn( "id" );
|
||||||
|
bookId.setDatatype( INTEGER );
|
||||||
|
bookId.setSize( Column.Size.precision( 18, 0 ) );
|
||||||
|
book.getPrimaryKey().addColumn( bookId );
|
||||||
|
book.getPrimaryKey().setName( "BOOK_PK" );
|
||||||
|
|
||||||
|
Table page = new Table( new ObjectName( null, null, "PAGE" ) );
|
||||||
|
|
||||||
|
Column pageId = page.createColumn( "id" );
|
||||||
|
pageId.setDatatype( INTEGER );
|
||||||
|
pageId.setSize( Column.Size.precision( 18, 0 ) );
|
||||||
|
page.getPrimaryKey().addColumn( pageId );
|
||||||
|
page.getPrimaryKey().setName( "PAGE_PK" );
|
||||||
|
|
||||||
|
Column pageBookId = page.createColumn( "BOOK_ID" );
|
||||||
|
pageId.setDatatype( INTEGER );
|
||||||
|
pageId.setSize( Column.Size.precision( 18, 0 ) );
|
||||||
|
ForeignKey pageBookFk = page.createForeignKey( book, "PAGE_BOOK_FK" );
|
||||||
|
pageBookFk.addColumn( pageBookId );
|
||||||
|
|
||||||
|
assertEquals( page, pageBookFk.getSourceTable() );
|
||||||
|
assertEquals( book, pageBookFk.getTargetTable() );
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue