blob: 7cfae9edfd10aa91efc6b37b0b71daec1012843a [file] [log] [blame]
/*
* Copyright (c) 1998, 2020 Oracle and/or its affiliates. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0,
* or the Eclipse Distribution License v. 1.0 which is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
*/
// Contributors:
// Oracle - initial API and implementation from Oracle TopLink
package org.eclipse.persistence.mappings.structures;
import org.eclipse.persistence.internal.helper.DatabaseField;
/**
* INTERNAL:
* A database field of object-relational type: either a java.sql.Array,
* java.sql.Struct, or java.sql.Ref.
* Oracle drivers require the user defined field type name for these fields,
* along with the generic sqlType: ARRAY, STRUCT, or REF.
* Toplink can only recognize primitive field types like Integer
* or String, but here custom java objects are being written to a single field.
* Thus instead of DatabaseField#type the driver needs a string representing
* the user defined type of the structure on the database, and the type of
* field: either ARRAY, STRUCT, or REF.
* Added for bug 2730536.
* @author Stephen McRitchie
* @since OracleAS TopLink 10<i>g</i> (9.0.4)
*/
public class ObjectRelationalDatabaseField extends DatabaseField {
protected String sqlTypeName;
protected DatabaseField nestedTypeField;
public ObjectRelationalDatabaseField(DatabaseField field) {
this.index = field.index;
this.name = field.getName();
this.table = field.getTable();
this.type = field.type;
this.useDelimiters = field.shouldUseDelimiters();
this.useUpperCaseForComparisons = field.getUseUpperCaseForComparisons();
this.nameForComparisons = field.getNameForComparisons();
this.typeName = field.getTypeName();
this.sqlTypeName = "";
}
public ObjectRelationalDatabaseField(String name) {
super(name);
this.sqlTypeName = "";
}
/*
* INTERNAL:
* Convert all the class-name-based settings in this mapping to actual
* class-based settings. This method is implemented by subclasses as
* necessary.
* @param classLoader
*/
@Override
public void convertClassNamesToClasses(ClassLoader classLoader) {
super.convertClassNamesToClasses(classLoader);
if (nestedTypeField != null) {
nestedTypeField.convertClassNamesToClasses(classLoader);
}
}
/**
* ADVANCED:
* For ARRAY and STRUCT fields, this is the user defined type for the field.
* For REF fields, this is the user defined type of entity is points to.
*/
public String getSqlTypeName() {
return sqlTypeName;
}
/**
* PUBLIC:
* Return if this is an ObjectRelationalDatabaseField.
*/
@Override
public boolean isObjectRelationalDatabaseField(){
return true;
}
/**
* ADVANCED:
* For ARRAY and STRUCT fields, this is the user defined type for the field.
* For REF fields, this is the user defined type of entity is points to.
*/
public void setSqlTypeName(String sqlTypeName) {
this.sqlTypeName = sqlTypeName;
}
/**
* ADVANCED:
* For ARRAY fields, this field's type represents the type contained in the ARRAY.
*/
public DatabaseField getNestedTypeField() {
return nestedTypeField;
}
/**
* ADVANCED:
* For ARRAY fields, this field's type represents the type contained in the ARRAY.
*/
public void setNestedTypeField(DatabaseField nestedTypeField) {
this.nestedTypeField = nestedTypeField;
}
}