|
Hibernate example source code file (AbstractPropertyHolder.java)
The Hibernate AbstractPropertyHolder.java source code/* * 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.cfg; import java.util.HashMap; import java.util.Map; import javax.persistence.AssociationOverride; import javax.persistence.AssociationOverrides; import javax.persistence.AttributeOverride; import javax.persistence.AttributeOverrides; import javax.persistence.Column; import javax.persistence.Embeddable; import javax.persistence.Entity; import javax.persistence.JoinColumn; import javax.persistence.JoinTable; import javax.persistence.MappedSuperclass; import org.hibernate.AssertionFailure; import org.hibernate.annotations.common.reflection.XAnnotatedElement; import org.hibernate.annotations.common.reflection.XClass; import org.hibernate.annotations.common.reflection.XProperty; import org.hibernate.internal.util.StringHelper; /** * @author Emmanuel Bernard */ public abstract class AbstractPropertyHolder implements PropertyHolder { protected AbstractPropertyHolder parent; private Map<String, Column[]> holderColumnOverride; private Map<String, Column[]> currentPropertyColumnOverride; private Map<String, JoinColumn[]> holderJoinColumnOverride; private Map<String, JoinColumn[]> currentPropertyJoinColumnOverride; private Map<String, JoinTable> holderJoinTableOverride; private Map<String, JoinTable> currentPropertyJoinTableOverride; private String path; private Mappings mappings; private Boolean isInIdClass; public AbstractPropertyHolder( String path, PropertyHolder parent, XClass clazzToProcess, Mappings mappings) { this.path = path; this.parent = (AbstractPropertyHolder) parent; this.mappings = mappings; buildHierarchyColumnOverride( clazzToProcess ); } public boolean isInIdClass() { return isInIdClass != null ? isInIdClass : parent != null ? parent.isInIdClass() : false; } public void setInIdClass(Boolean isInIdClass) { this.isInIdClass = isInIdClass; } public String getPath() { return path; } protected Mappings getMappings() { return mappings; } /** * property can be null */ protected void setCurrentProperty(XProperty property) { if ( property == null ) { this.currentPropertyColumnOverride = null; this.currentPropertyJoinColumnOverride = null; this.currentPropertyJoinTableOverride = null; } else { this.currentPropertyColumnOverride = buildColumnOverride( property, getPath() ); if ( this.currentPropertyColumnOverride.size() == 0 ) { this.currentPropertyColumnOverride = null; } this.currentPropertyJoinColumnOverride = buildJoinColumnOverride( property, getPath() ); if ( this.currentPropertyJoinColumnOverride.size() == 0 ) { this.currentPropertyJoinColumnOverride = null; } this.currentPropertyJoinTableOverride = buildJoinTableOverride( property, getPath() ); if ( this.currentPropertyJoinTableOverride.size() == 0 ) { this.currentPropertyJoinTableOverride = null; } } } /** * Get column overriding, property first, then parent, then holder * replace the placeholder 'collection&&element' with nothing * * These rules are here to support both JPA 2 and legacy overriding rules. * */ public Column[] getOverriddenColumn(String propertyName) { Column[] result = getExactOverriddenColumn( propertyName ); if (result == null) { //the commented code can be useful if people use the new prefixes on old mappings and vice versa // if we enable them: // WARNING: this can conflict with user's expectations if: // - the property uses some restricted values // - the user has overridden the column // also change getOverriddenJoinColumn and getOverriddenJoinTable as well // if ( propertyName.contains( ".key." ) ) { // //support for legacy @AttributeOverride declarations // //TODO cache the underlying regexp // result = getExactOverriddenColumn( propertyName.replace( ".key.", ".index." ) ); // } // if ( result == null && propertyName.endsWith( ".key" ) ) { // //support for legacy @AttributeOverride declarations // //TODO cache the underlying regexp // result = getExactOverriddenColumn( // propertyName.substring( 0, propertyName.length() - ".key".length() ) + ".index" // ); // } // if ( result == null && propertyName.contains( ".value." ) ) { // //support for legacy @AttributeOverride declarations // //TODO cache the underlying regexp // result = getExactOverriddenColumn( propertyName.replace( ".value.", ".element." ) ); // } // if ( result == null && propertyName.endsWith( ".value" ) ) { // //support for legacy @AttributeOverride declarations // //TODO cache the underlying regexp // result = getExactOverriddenColumn( // propertyName.substring( 0, propertyName.length() - ".value".length() ) + ".element" // ); // } if ( result == null && propertyName.contains( ".collection&&element." ) ) { //support for non map collections where no prefix is needed //TODO cache the underlying regexp result = getExactOverriddenColumn( propertyName.replace( ".collection&&element.", "." ) ); } } return result; } /** * Get column overriding, property first, then parent, then holder * find the overridden rules from the exact property name. */ private Column[] getExactOverriddenColumn(String propertyName) { Column[] override = null; if ( parent != null ) { override = parent.getExactOverriddenColumn( propertyName ); } if ( override == null && currentPropertyColumnOverride != null ) { override = currentPropertyColumnOverride.get( propertyName ); } if ( override == null && holderColumnOverride != null ) { override = holderColumnOverride.get( propertyName ); } return override; } /** * Get column overriding, property first, then parent, then holder * replace the placeholder 'collection&&element' with nothing * * These rules are here to support both JPA 2 and legacy overriding rules. * */ public JoinColumn[] getOverriddenJoinColumn(String propertyName) { JoinColumn[] result = getExactOverriddenJoinColumn( propertyName ); if ( result == null && propertyName.contains( ".collection&&element." ) ) { //support for non map collections where no prefix is needed //TODO cache the underlying regexp result = getExactOverriddenJoinColumn( propertyName.replace( ".collection&&element.", "." ) ); } return result; } /** * Get column overriding, property first, then parent, then holder */ private JoinColumn[] getExactOverriddenJoinColumn(String propertyName) { JoinColumn[] override = null; if ( parent != null ) { override = parent.getExactOverriddenJoinColumn( propertyName ); } if ( override == null && currentPropertyJoinColumnOverride != null ) { override = currentPropertyJoinColumnOverride.get( propertyName ); } if ( override == null && holderJoinColumnOverride != null ) { override = holderJoinColumnOverride.get( propertyName ); } return override; } /** * Get column overriding, property first, then parent, then holder * replace the placeholder 'collection&&element' with nothing * * These rules are here to support both JPA 2 and legacy overriding rules. * */ public JoinTable getJoinTable(XProperty property) { final String propertyName = StringHelper.qualify( getPath(), property.getName() ); JoinTable result = getOverriddenJoinTable( propertyName ); if (result == null) { result = property.getAnnotation( JoinTable.class ); } return result; } /** * Get column overriding, property first, then parent, then holder * replace the placeholder 'collection&&element' with nothing * * These rules are here to support both JPA 2 and legacy overriding rules. * */ public JoinTable getOverriddenJoinTable(String propertyName) { JoinTable result = getExactOverriddenJoinTable( propertyName ); if ( result == null && propertyName.contains( ".collection&&element." ) ) { //support for non map collections where no prefix is needed //TODO cache the underlying regexp result = getExactOverriddenJoinTable( propertyName.replace( ".collection&&element.", "." ) ); } return result; } /** * Get column overriding, property first, then parent, then holder */ private JoinTable getExactOverriddenJoinTable(String propertyName) { JoinTable override = null; if ( parent != null ) { override = parent.getExactOverriddenJoinTable( propertyName ); } if ( override == null && currentPropertyJoinTableOverride != null ) { override = currentPropertyJoinTableOverride.get( propertyName ); } if ( override == null && holderJoinTableOverride != null ) { override = holderJoinTableOverride.get( propertyName ); } return override; } private void buildHierarchyColumnOverride(XClass element) { XClass current = element; Map<String, Column[]> columnOverride = new HashMap Other Hibernate examples (source code examples)Here is a short list of links related to this Hibernate AbstractPropertyHolder.java source code file: |
... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2021 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.