Package org.hibernate.cfg

Source Code of org.hibernate.cfg.InheritanceState

/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* Copyright (c) 2008, Red Hat Middleware LLC 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 Middleware LLC.
*
* 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.Map;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.MappedSuperclass;

import org.hibernate.annotations.common.reflection.XAnnotatedElement;
import org.hibernate.annotations.common.reflection.XClass;

/**
* Some extra data to the inheritance position of a class.
*
* @author Emmanuel Bernard
*/
public class InheritanceState {
  public InheritanceState(XClass clazz) {
    this.setClazz( clazz );
    extractInheritanceType();
  }

  private XClass clazz;

  /**
   * Has sibling (either mappedsuperclass entity)
   */
  private boolean hasSiblings = false;

  /**
   * a mother entity is available
   */
  private boolean hasParents = false;
  private InheritanceType type;
  private boolean isEmbeddableSuperclass = false;

  private void extractInheritanceType() {
    XAnnotatedElement element = getClazz();
    Inheritance inhAnn = element.getAnnotation( Inheritance.class );
    MappedSuperclass mappedSuperClass = element.getAnnotation( MappedSuperclass.class );
    if ( mappedSuperClass != null ) {
      setEmbeddableSuperclass( true );
      setType( inhAnn == null ? null : inhAnn.strategy() );
    }
    else {
      setType( inhAnn == null ? InheritanceType.SINGLE_TABLE : inhAnn.strategy() );
    }
  }

  boolean hasTable() {
    return !hasParents() || !InheritanceType.SINGLE_TABLE.equals( getType() );
  }

  boolean hasDenormalizedTable() {
    return hasParents() && InheritanceType.TABLE_PER_CLASS.equals( getType() );
  }

  public static InheritanceState getInheritanceStateOfSuperEntity(
      XClass clazz, Map<XClass, InheritanceState> states
  ) {
    XClass superclass = clazz;
    do {
      superclass = superclass.getSuperclass();
      InheritanceState currentState = states.get( superclass );
      if ( currentState != null && !currentState.isEmbeddableSuperclass() ) {
        return currentState;
      }
    }
    while ( superclass != null && !Object.class.getName().equals( superclass.getName() ) );
    return null;
  }

  public static InheritanceState getSuperclassInheritanceState( XClass clazz, Map<XClass, InheritanceState> states) {
    XClass superclass = clazz;
    do {
      superclass = superclass.getSuperclass();
      InheritanceState currentState = states.get( superclass );
      if ( currentState != null ) {
        return currentState;
      }
    }
    while ( superclass != null && !Object.class.getName().equals( superclass.getName() ) );
    return null;
  }

  public XClass getClazz() {
    return clazz;
  }

  public void setClazz(XClass clazz) {
    this.clazz = clazz;
  }

  public boolean hasSiblings() {
    return hasSiblings;
  }

  public void setHasSiblings(boolean hasSiblings) {
    this.hasSiblings = hasSiblings;
  }

  public boolean hasParents() {
    return hasParents;
  }

  public void setHasParents(boolean hasParents) {
    this.hasParents = hasParents;
  }

  public InheritanceType getType() {
    return type;
  }

  public void setType(InheritanceType type) {
    this.type = type;
  }

  public boolean isEmbeddableSuperclass() {
    return isEmbeddableSuperclass;
  }

  public void setEmbeddableSuperclass(boolean embeddableSuperclass) {
    isEmbeddableSuperclass = embeddableSuperclass;
  }
}
TOP

Related Classes of org.hibernate.cfg.InheritanceState

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.