@Override
 public void setHibernateType(Type type) {
   if (type == null) {
     throw new IllegalArgumentException("Type cannot be null");
   }
   this.hibernateType = type;
   this.sqlTypes = hibernateType.sqlTypes(session().getFactory());
 }
Example #2
0
 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() != 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);
   }
 }
Example #3
0
  /**
   * @param column
   * @param generatedIdentifier
   * @return
   */
  private String guessAndAlignType(
      Table table, Column column, Mapping mapping, boolean generatedIdentifier) {
    // TODO: this method mutates the column if the types does not match...not good.
    // maybe we should copy the column instead before calling this method.
    Integer sqlTypeCode = column.getSqlTypeCode();
    String location =
        "Table: "
            + Table.qualify(table.getCatalog(), table.getSchema(), table.getQuotedName())
            + " column: "
            + column.getQuotedName();
    if (sqlTypeCode == null) {
      throw new JDBCBinderException("sqltype is null for " + location);
    }

    String preferredHibernateType =
        revengStrategy.columnToHibernateTypeName(
            TableIdentifier.create(table),
            column.getName(),
            sqlTypeCode.intValue(),
            column.getLength(),
            column.getPrecision(),
            column.getScale(),
            column.isNullable(),
            generatedIdentifier);

    Type wantedType = TypeFactory.heuristicType(preferredHibernateType);

    if (wantedType != null) {
      int[] wantedSqlTypes = wantedType.sqlTypes(mapping);

      if (wantedSqlTypes.length > 1) {
        throw new JDBCBinderException(
            "The type "
                + preferredHibernateType
                + " found on "
                + location
                + " spans multiple columns. Only single column types allowed.");
      }

      int wantedSqlType = wantedSqlTypes[0];
      if (wantedSqlType != sqlTypeCode.intValue()) {
        log.debug(
            "Sql type mismatch for "
                + location
                + " between DB and wanted hibernate type. Sql type set to "
                + typeCodeName(sqlTypeCode.intValue())
                + " instead of "
                + typeCodeName(wantedSqlType));
        column.setSqlTypeCode(new Integer(wantedSqlType));
      }
    } else {
      log.debug(
          "No Hibernate type found for "
              + preferredHibernateType
              + ". Most likely cause is a missing UserType class.");
    }

    if (preferredHibernateType == null) {
      throw new JDBCBinderException(
          "Could not find javatype for " + typeCodeName(sqlTypeCode.intValue()));
    }

    return preferredHibernateType;
  }