/******************************************************************************* * Copyright (c) 1998, 2015 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 v1.0 and Eclipse Distribution License v. 1.0 * which accompanies this distribution. * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html * and the Eclipse Distribution License is available at * http://www.eclipse.org/org/documents/edl-v10.php. * * 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 */ 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. */ 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; } }