org.hibernate.mapping.Column.java

 

Hibernate中表字段的抽象类

 


package org.hibernate.mapping;

import java.io.Serializable;

import org.hibernate.HibernateException;
import org.hibernate.MappingException;
import org.hibernate.dialect.Dialect;
import org.hibernate.engine.Mapping;
import org.hibernate.util.StringHelper;

/**
 * A column of a relational database table
 * @author Gavin King
 */
public class Column implements Selectable, Serializable, Cloneable {

 public static final int DEFAULT_LENGTH = 255;
 public static final int DEFAULT_PRECISION = 19;
 public static final int DEFAULT_SCALE = 2;

 private int length=DEFAULT_LENGTH;
 private int precision=DEFAULT_PRECISION;
 private int scale=DEFAULT_SCALE;
 private Value value;
 private int typeIndex = 0;
 private String name;
 private boolean nullable=true;
 private boolean unique=false;
 private String sqlType;
 private Integer sqlTypeCode;
 private boolean quoted=false;
 int uniqueInteger;
 private String checkConstraint;
 private String comment;
 private String defaultValue;

 public Column() { };

 public Column(String columnName) {
  setName(columnName);
 }

 public int getLength() {
  return length;
 }
 public void setLength(int length) {
  this.length = length;
 }
 public Value getValue() {
  return value;
 }
 public void setValue(Value value) {
  this.value= value;
 }
 public String getName() {
  return name;
 }
 public void setName(String name) {
  if (
   name.charAt(0)=='`' ||
   Dialect.QUOTE.indexOf( name.charAt(0) ) > -1 //TODO: deprecated, remove eventually
  ) {
   quoted=true;
   this.name=name.substring( 1, name.length()-1 );
  }
  else {
   this.name = name;
  }
 }

 /** returns quoted name as it would be in the mapping file. */
 public String getQuotedName() {
  return quoted ?
    "`" + name + "`" :
    name;
 }

 public String getQuotedName(Dialect d) {
  return quoted ?
   d.openQuote() + name + d.closeQuote() :
   name;
 }
 
 /**
  * For any column name, generate an alias that is unique
  * to that column name, and also 10 characters or less
  * in length.
  */
 public String getAlias(Dialect dialect) {
  String alias = name;
  String unique = Integer.toString(uniqueInteger) + '_';
  int lastLetter = StringHelper.lastIndexOfLetter(name);
  if ( lastLetter == -1 ) {
   alias = "column";
  }
  else if ( lastLetter < name.length()-1 ) {
   alias = name.substring(0, lastLetter+1);
  }
  if ( alias.length() > dialect.getMaxAliasLength() ) {
   alias = alias.substring( 0, dialect.getMaxAliasLength() - unique.length() );
  }
  boolean useRawName = name.equals(alias) &&
   !quoted &&
   !name.toLowerCase().equals("rowid");
  if ( useRawName ) {
   return alias;
  }
  else {
   return alias + unique;
  }
 }
 
 /**
  * Generate a column alias that is unique across multiple tables
  */
 public String getAlias(Dialect dialect, Table table) {
  return getAlias(dialect) + table.getUniqueInteger() + '_';
 }

 public boolean isNullable() {
  return nullable;
 }

 public void setNullable(boolean nullable) {
  this.nullable=nullable;
 }

 public int getTypeIndex() {
  return typeIndex;
 }
 public void setTypeIndex(int typeIndex) {
  this.typeIndex = typeIndex;
 }

 public int getSqlTypeCode(Mapping mapping) throws MappingException {
  org.hibernate.type.Type type = getValue().getType();
  try {
   int sqlTypeCode = type.sqlTypes(mapping)[ getTypeIndex() ];
   if(getSqlTypeCode()!=null && getSqlTypeCode().intValue()!=sqlTypeCode) {
    throw new MappingException("SQLType code's does not match. mapped as " + sqlTypeCode + " but is " + getSqlTypeCode() );
   }
   return sqlTypeCode;
  }
  catch (Exception e) {
   throw new MappingException(
     "Could not determine type for column " +
     name +
     " of type " +
     type.getClass().getName() +
     ": " +
     e.getClass().getName(),
     e
    );
  }
 }

 /**
  * Returns the underlying columns sqltypecode.
  * If null, it is because the sqltype code is unknown.
  *
  * Use #getSqlTypeCode(Mapping) to retreive the sqltypecode used
  * for the columns associated Value/Type.
  *
  * @return sqltypecode if it is set, otherwise null.
  */
 public Integer getSqlTypeCode() {
  return sqlTypeCode;
 }
 
 public void setSqlTypeCode(Integer typecode) {
  sqlTypeCode=typecode;
 }
 
 public boolean isUnique() {
  return unique;
 }


 public String getSqlType(Dialect dialect, Mapping mapping) throws HibernateException {
  return sqlType==null ?
   dialect.getTypeName( getSqlTypeCode(mapping), getLength(), getPrecision(), getScale() ) :
   sqlType;
 }

 public boolean equals(Object object) {
  return object instanceof Column && equals( (Column) object );
 }

 public boolean equals(Column column) {
  if (null == column) return false;
  if (this == column) return true;

  return isQuoted() ?
   name.equals(column.name) :
   name.equalsIgnoreCase(column.name);
 }

 //used also for generation of FK names!
 public int hashCode() {
  return isQuoted() ?
   name.hashCode() :
   name.toLowerCase().hashCode();
 }

 public String getSqlType() {
  return sqlType;
 }

 public void setSqlType(String sqlType) {
  this.sqlType = sqlType;
 }

 public void setUnique(boolean unique) {
  this.unique = unique;
 }

 public boolean isQuoted() {
  return quoted;
 }

 public String toString() {
  return getClass().getName() + '(' + getName() + ')';
 }

 public String getCheckConstraint() {
  return checkConstraint;
 }

 public void setCheckConstraint(String checkConstraint) {
  this.checkConstraint = checkConstraint;
 }

 public boolean hasCheckConstraint() {
  return checkConstraint!=null;
 }

 public String getTemplate(Dialect dialect) {
  return getQuotedName(dialect);
 }

 public boolean isFormula() {
  return false;
 }

 public String getText(Dialect d) {
  return getQuotedName(d);
 }
 public String getText() {
  return getName();
 }
 
 public int getPrecision() {
  return precision;
 }
 public void setPrecision(int scale) {
  this.precision = scale;
 }

 public int getScale() {
  return scale;
 }
 public void setScale(int scale) {
  this.scale = scale;
 }

 public String getComment() {
  return comment;
 }

 public void setComment(String comment) {
  this.comment = comment;
 }

 public String getDefaultValue() {
  return defaultValue;
 }

 public void setDefaultValue(String defaultValue) {
  this.defaultValue = defaultValue;
 }

 public String getCanonicalName() {
  return quoted ? name : name.toLowerCase();
 }

 /**
  * Shallow copy, the value is not copied
  */
 protected Object clone() {
  Column copy = new Column();
  copy.setLength( length );
  copy.setScale( scale );
  copy.setValue( value );
  copy.setTypeIndex( typeIndex );
  copy.setName( getQuotedName() );
  copy.setNullable( nullable );
  copy.setPrecision( precision );
  copy.setUnique( unique );
  copy.setSqlType( sqlType );
  copy.setSqlTypeCode( sqlTypeCode );
  copy.uniqueInteger = uniqueInteger; //usually useless
  copy.setCheckConstraint( checkConstraint );
  copy.setComment( comment );
  copy.setDefaultValue( defaultValue );
  return copy;
 }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值