/**
  * 識別子メタデータを処理します。
  *
  * @param propertyMeta プロパティメタデータ
  * @param field フィールド
  * @param entityMeta エンティティメタデータ
  */
 protected void doId(PropertyMeta propertyMeta, Field field, EntityMeta entityMeta) {
   propertyMeta.setId(field.getAnnotation(Id.class) != null);
   GeneratedValue generatedValue = field.getAnnotation(GeneratedValue.class);
   if (generatedValue == null) {
     return;
   }
   GenerationType generationType = generatedValue.strategy();
   propertyMeta.setGenerationType(generationType);
   switch (generationType) {
     case AUTO:
       doIdentityIdGenerator(propertyMeta, entityMeta);
       doSequenceIdGenerator(propertyMeta, generatedValue, entityMeta);
       doTableIdGenerator(propertyMeta, generatedValue, entityMeta);
       break;
     case IDENTITY:
       doIdentityIdGenerator(propertyMeta, entityMeta);
       break;
     case SEQUENCE:
       if (!doSequenceIdGenerator(propertyMeta, generatedValue, entityMeta)) {
         throw new IdGeneratorNotFoundRuntimeException(
             entityMeta.getName(), propertyMeta.getName(), generatedValue.generator());
       }
       break;
     case TABLE:
       if (!doTableIdGenerator(propertyMeta, generatedValue, entityMeta)) {
         throw new IdGeneratorNotFoundRuntimeException(
             entityMeta.getName(), propertyMeta.getName(), generatedValue.generator());
       }
       break;
   }
 }
 /** set句の準備をします。 */
 protected void prepareSetClause() {
   for (final PropertyMeta propertyMeta : targetProperties) {
     setClause.addSql(propertyMeta.getColumnMeta().getName());
   }
   if (!includeVersion && entityMeta.hasVersionPropertyMeta()) {
     final PropertyMeta propertyMeta = entityMeta.getVersionPropertyMeta();
     final String columnName = propertyMeta.getColumnMeta().getName();
     setClause.addSql(columnName, columnName + " + 1");
   }
 }
 /**
  * enumの種別を処理します。
  *
  * @param propertyMeta プロパティメタデータ
  * @param field フィールド
  * @param entityMeta エンティティメタデータ
  */
 protected void doEnum(PropertyMeta propertyMeta, Field field, EntityMeta entityMeta) {
   if (!propertyMeta.getPropertyClass().isEnum()) {
     return;
   }
   Enumerated enumerated = field.getAnnotation(Enumerated.class);
   if (enumerated == null) {
     return;
   }
   propertyMeta.setEnumType(enumerated.value());
 }
 /**
  * 一対多の関連を処理します。
  *
  * @param propertyMeta プロパティメタデータ
  * @param field フィールド
  * @param entityMeta エンティティメタデータ
  * @param oneToMany 一対多関連
  */
 protected void doOneToMany(
     PropertyMeta propertyMeta, Field field, EntityMeta entityMeta, OneToMany oneToMany) {
   propertyMeta.setRelationshipType(RelationshipType.ONE_TO_MANY);
   if (!List.class.isAssignableFrom(field.getType())) {
     throw new OneToManyNotListRuntimeException(entityMeta.getName(), propertyMeta.getName());
   }
   Class<?> relationshipClass = ReflectionUtil.getElementTypeOfList(field.getGenericType());
   if (relationshipClass == null) {
     throw new OneToManyNotGenericsRuntimeException(entityMeta.getName(), propertyMeta.getName());
   }
   if (relationshipClass.getAnnotation(Entity.class) == null) {
     throw new RelationshipNotEntityRuntimeException(
         entityMeta.getName(), propertyMeta.getName(), relationshipClass);
   }
   propertyMeta.setRelationshipClass(relationshipClass);
   String mappedBy = oneToMany.mappedBy();
   if (!StringUtil.isEmpty(mappedBy)) {
     if (propertyMeta.getJoinColumnMetaList().size() > 0) {
       throw new BothMappedByAndJoinColumnRuntimeException(
           entityMeta.getName(), propertyMeta.getName());
     }
     propertyMeta.setMappedBy(mappedBy);
   } else {
     throw new MappedByMandatoryRuntimeException(entityMeta.getName(), propertyMeta.getName());
   }
 }
 /** where句の準備をします。 */
 protected void prepareWhereClause() {
   for (final PropertyMeta propertyMeta : entityMeta.getIdPropertyMetaList()) {
     whereClause.addAndSql(
         ConditionType.EQ.getCondition(propertyMeta.getColumnMeta().getName(), null));
   }
   if (!includeVersion && entityMeta.hasVersionPropertyMeta()) {
     final PropertyMeta propertyMeta = entityMeta.getVersionPropertyMeta();
     whereClause.addAndSql(
         ConditionType.EQ.getCondition(propertyMeta.getColumnMeta().getName(), null));
   }
 }
 /**
  * 時制の種別を処理します。
  *
  * @param propertyMeta プロパティメタデータ
  * @param field フィールド
  * @param entityMeta エンティティメタデータ
  */
 protected void doTemporal(PropertyMeta propertyMeta, Field field, EntityMeta entityMeta) {
   if (propertyMeta.getPropertyClass() != java.util.Date.class
       && propertyMeta.getPropertyClass() != Calendar.class) {
     return;
   }
   Temporal temporal = field.getAnnotation(Temporal.class);
   if (temporal == null) {
     throw new TemporalTypeNotSpecifiedRuntimeException(
         entityMeta.getName(), propertyMeta.getName());
   }
   propertyMeta.setTemporalType(temporal.value());
 }
 /**
  * フェッチタイプを処理します。
  *
  * @param propertyMeta プロパティメタデータ
  * @param field フィールド
  * @param entityMeta エンティティメタデータ
  */
 protected void doFetchType(
     final PropertyMeta propertyMeta, final Field field, final EntityMeta entityMeta) {
   final Basic basic = field.getAnnotation(Basic.class);
   if (basic == null) {
     propertyMeta.setFetchType(FetchType.EAGER);
     return;
   }
   if (propertyMeta.isId() && basic.fetch() == FetchType.LAZY) {
     throw new LazyFetchSpecifiedRuntimeException(entityMeta.getName(), propertyMeta.getName());
   }
   propertyMeta.setFetchType(basic.fetch());
 }
 /**
  * 多対一の関連を処理します。
  *
  * @param propertyMeta プロパティメタデータ
  * @param field フィールド
  * @param entityMeta エンティティメタデータ
  * @param manyToOne 多対一関連
  */
 protected void doManyToOne(
     PropertyMeta propertyMeta,
     Field field,
     EntityMeta entityMeta,
     @SuppressWarnings("unused") ManyToOne manyToOne) {
   propertyMeta.setRelationshipType(RelationshipType.MANY_TO_ONE);
   Class<?> relationshipClass = field.getType();
   if (relationshipClass.getAnnotation(Entity.class) == null) {
     throw new RelationshipNotEntityRuntimeException(
         entityMeta.getName(), propertyMeta.getName(), relationshipClass);
   }
   propertyMeta.setRelationshipClass(relationshipClass);
 }
 /**
  * バージョンチェック用かどうかを処理します。
  *
  * @param propertyMeta プロパティメタデータ
  * @param field フィールド
  * @param entityMeta エンティティメタデータ
  */
 protected void doVersion(
     PropertyMeta propertyMeta, Field field, @SuppressWarnings("unused") EntityMeta entityMeta) {
   if (field.getAnnotation(Version.class) == null) {
     return;
   }
   Class<?> clazz = ClassUtil.getWrapperClassIfPrimitive(field.getType());
   if (clazz != Integer.class
       && clazz != Long.class
       && clazz != int.class
       && clazz != long.class) {
     throw new VersionPropertyNotNumberRuntimeException(
         entityMeta.getName(), propertyMeta.getName());
   }
   propertyMeta.setVersion(true);
 }
 /**
  * カラムを処理します。
  *
  * @param entityMeta エンティティメタデータ
  * @param propertyMeta プロパティメタデータ
  * @param foreignKeyDesc 外部キー記述
  */
 protected void doColumn(
     EntityMeta entityMeta, PropertyMeta propertyMeta, ForeignKeyDesc foreignKeyDesc) {
   for (JoinColumnMeta jcm : propertyMeta.getJoinColumnMetaList()) {
     foreignKeyDesc.addColumnName(jcm.getName());
     foreignKeyDesc.addReferencedColumnName(jcm.getReferencedColumnName());
   }
 }
 /**
  * 参照整合制約を返します。
  *
  * @param propertyMeta プロパティメタデータ
  * @return 参照整合制約
  */
 protected ReferentialConstraint getReferentialConstraint(PropertyMeta propertyMeta) {
   ReferentialConstraint referentialConstraint =
       propertyMeta.getField().getAnnotation(ReferentialConstraint.class);
   return referentialConstraint != null
       ? referentialConstraint
       : AnnotationUtil.getDefaultReferentialConstraint();
 }
 /**
  * シーケンスの名前を返します。
  *
  * @param entityMeta エンティティメタデータ
  * @param propertyMeta プロパティメタデータ
  * @param sequenceGenerator シーケンスジェネレータ
  * @return シーケンスの名前
  */
 protected String getSequenceName(
     EntityMeta entityMeta, PropertyMeta propertyMeta, SequenceGenerator sequenceGenerator) {
   String sequenceName = sequenceGenerator.sequenceName();
   if (!StringUtil.isEmpty(sequenceName)) {
     return sequenceName;
   }
   return entityMeta.getTableMeta().getName() + "_" + propertyMeta.getColumnMeta().getName();
 }
Example #13
0
 /** set句に設定されるプロパティの準備をします。 */
 protected void prepareTargetProperties() {
   for (final PropertyMeta propertyMeta : entityMeta.getAllColumnPropertyMeta()) {
     final String propertyName = propertyMeta.getName();
     if (propertyMeta.isId() || !propertyMeta.getColumnMeta().isUpdatable()) {
       continue;
     }
     if (propertyMeta.isVersion() && !includeVersion) {
       continue;
     }
     if (!includesProperties.isEmpty() && !includesProperties.contains(propertyName)) {
       continue;
     }
     if (excludesProperties.contains(propertyName)) {
       continue;
     }
     targetProperties.add(propertyMeta);
   }
 }
 /**
  * {@link GenerationType#TABLE}方式で識別子の値を自動生成するIDジェネレータを処理します。
  *
  * @param propertyMeta プロパティメタデータ
  * @param generatedValue 識別子に付けられた{@link GeneratedValue}アノテーション
  * @param entityMeta エンティティのメタデータ
  * @return {@link GenerationType#TABLE}方式で識別子の値を自動生成するIDジェネレータが存在した場合に <code>true</code>
  */
 protected boolean doTableIdGenerator(
     PropertyMeta propertyMeta, GeneratedValue generatedValue, EntityMeta entityMeta) {
   String name = generatedValue.generator();
   TableGenerator tableGenerator;
   if (StringUtil.isEmpty(name)) {
     tableGenerator = DEFAULT_TABLE_GENERATOR;
   } else {
     tableGenerator = propertyMeta.getField().getAnnotation(TableGenerator.class);
     if (tableGenerator == null || !name.equals(tableGenerator.name())) {
       tableGenerator = entityMeta.getEntityClass().getAnnotation(TableGenerator.class);
       if (tableGenerator == null || !name.equals(tableGenerator.name())) {
         return false;
       }
     }
   }
   propertyMeta.setTableIdGenerator(
       new TableIdGenerator(entityMeta, propertyMeta, tableGenerator));
   return true;
 }
 /**
  * {@link GenerationType#SEQUENCE}方式で識別子の値を自動生成するIDジェネレータを処理します。
  *
  * @param propertyMeta プロパティメタデータ
  * @param generatedValue 識別子に付けられた{@link GeneratedValue}アノテーション
  * @param entityMeta エンティティのメタデータ
  * @return {@link GenerationType#SEQUENCE}方式で識別子の値を自動生成するIDジェネレータが存在した場合に <code>true</code>
  */
 protected boolean doSequenceIdGenerator(
     PropertyMeta propertyMeta, GeneratedValue generatedValue, EntityMeta entityMeta) {
   String name = generatedValue.generator();
   SequenceGenerator sequenceGenerator;
   if (StringUtil.isEmpty(name)) {
     sequenceGenerator = DEFAULT_SEQUENCE_GENERATOR;
   } else {
     sequenceGenerator = propertyMeta.getField().getAnnotation(SequenceGenerator.class);
     if (sequenceGenerator == null || !name.equals(sequenceGenerator.name())) {
       sequenceGenerator = entityMeta.getEntityClass().getAnnotation(SequenceGenerator.class);
       if (sequenceGenerator == null || !name.equals(sequenceGenerator.name())) {
         return false;
       }
     }
   }
   propertyMeta.setSequenceIdGenerator(
       new SequenceIdGenerator(entityMeta, propertyMeta, sequenceGenerator));
   return true;
 }
 /**
  * テーブルを処理します。
  *
  * @param entityMeta エンティティメタデータ
  * @param propertyMeta プロパティメタデータ
  * @param foreignKeyDesc 外部キー記述
  */
 protected void doTable(
     EntityMeta entityMeta, PropertyMeta propertyMeta, ForeignKeyDesc foreignKeyDesc) {
   EntityMeta inverseEntityMeta =
       entityMetaFactory.getEntityMeta(propertyMeta.getRelationshipClass());
   TableMeta tableMeta = inverseEntityMeta.getTableMeta();
   foreignKeyDesc.setReferencedCatalogName(tableMeta.getCatalog());
   foreignKeyDesc.setReferencedSchemaName(tableMeta.getSchema());
   foreignKeyDesc.setReferencedTableName(tableMeta.getName());
   foreignKeyDesc.setReferencedFullTableName(tableMeta.getFullName());
 }
 public SequenceDesc getSequenceDesc(EntityMeta entityMeta, PropertyMeta propertyMeta) {
   GenerationType generationType = propertyMeta.getGenerationType();
   if (generationType == GenerationType.AUTO) {
     generationType = dialect.getDefaultGenerationType();
   }
   if (generationType == GenerationType.SEQUENCE) {
     if (!dialect.supportsSequence()) {
       throw new UnsupportedGenerationTypeRuntimeException(
           GenerationType.SEQUENCE, entityMeta.getName(), propertyMeta.getName());
     }
     SequenceGenerator generator = getSequenceGenerator(entityMeta, propertyMeta);
     SequenceDesc sequenceDesc = new SequenceDesc();
     String sequenceName = getSequenceName(entityMeta, propertyMeta, generator);
     sequenceDesc.setSequenceName(sequenceName);
     sequenceDesc.setInitialValue(generator.initialValue());
     sequenceDesc.setAllocationSize(generator.allocationSize());
     sequenceDesc.setDataType(getDataType(propertyMeta));
     return sequenceDesc;
   }
   return null;
 }
  public ForeignKeyDesc getForeignKeyDesc(EntityMeta entityMeta, PropertyMeta propertyMeta) {
    if (!propertyMeta.isRelationship() || propertyMeta.getMappedBy() != null) {
      return null;
    }
    ReferentialConstraint referentialConstraint =
        propertyMeta.getField().getAnnotation(ReferentialConstraint.class);
    if (referentialConstraint == null) {
      if (!regardRelationshipAsFk) {
        return null;
      }
    } else {
      if (!referentialConstraint.enable()) {
        return null;
      }
    }

    ForeignKeyDesc foreignKeyDesc = new ForeignKeyDesc();
    doColumn(entityMeta, propertyMeta, foreignKeyDesc);
    doTable(entityMeta, propertyMeta, foreignKeyDesc);
    doReferetialAction(entityMeta, propertyMeta, foreignKeyDesc);
    return foreignKeyDesc;
  }
 /**
  * 関連用のクラスを返します。
  *
  * @param propertyMeta プロパティメタデータ
  * @param field フィールド
  * @param entityMeta エンティティメタデータ
  * @return 関連用のクラス
  * @throws OneToManyNotGenericsRuntimeException 一対多の関連がジェネリクスのリストではない場合。
  */
 protected Class<?> getRelationshipClass(
     PropertyMeta propertyMeta, Field field, EntityMeta entityMeta)
     throws OneToManyNotGenericsRuntimeException {
   Class<?> clazz = field.getType();
   if (List.class.isAssignableFrom(clazz)) {
     clazz = ReflectionUtil.getElementTypeOfList(field.getGenericType());
     if (clazz == null) {
       throw new OneToManyNotGenericsRuntimeException(
           entityMeta.getName(), propertyMeta.getName());
     }
   }
   return clazz;
 }
 /**
  * JoinColumnを処理します。
  *
  * @param propertyMeta プロパティメタデータ
  * @param field フィールド
  * @param entityMeta エンティティメタデータ
  */
 protected void doJoinColumn(PropertyMeta propertyMeta, Field field, EntityMeta entityMeta) {
   JoinColumn joinColumn = field.getAnnotation(JoinColumn.class);
   if (joinColumn != null) {
     JoinColumnMeta meta =
         new JoinColumnMeta(joinColumn.name(), joinColumn.referencedColumnName());
     propertyMeta.addJoinColumnMeta(meta);
   } else {
     JoinColumns joinColumns = field.getAnnotation(JoinColumns.class);
     if (joinColumns != null) {
       JoinColumn[] array = joinColumns.value();
       for (int i = 0; i < array.length; i++) {
         JoinColumn jc = array[i];
         JoinColumnMeta meta = new JoinColumnMeta(jc.name(), jc.referencedColumnName());
         if (i > 0 && (meta.getName() == null || meta.getReferencedColumnName() == null)) {
           throw new JoinColumnNameAndReferencedColumnNameMandatoryRuntimeException(
               entityMeta.getName(), propertyMeta.getName(), i + 1);
         }
         propertyMeta.addJoinColumnMeta(meta);
       }
     }
   }
 }
 public PropertyMeta createPropertyMeta(Field field, EntityMeta entityMeta) {
   PropertyMeta propertyMeta = new PropertyMeta();
   doField(propertyMeta, field, entityMeta);
   doName(propertyMeta, field, entityMeta);
   doTransient(propertyMeta, field, entityMeta);
   if (!propertyMeta.isTransient()) {
     Object relationshipAnnotation = getRelationshipAnnotation(field);
     if (relationshipAnnotation == null) {
       doColumnMeta(propertyMeta, field, entityMeta);
       doId(propertyMeta, field, entityMeta);
       doFetchType(propertyMeta, field, entityMeta);
       doTemporal(propertyMeta, field, entityMeta);
       doEnum(propertyMeta, field, entityMeta);
       doVersion(propertyMeta, field, entityMeta);
       doLob(propertyMeta, field, entityMeta);
       doValueType(propertyMeta, entityMeta);
     } else {
       doRelationship(propertyMeta, field, entityMeta, relationshipAnnotation);
     }
   }
   doCustomize(propertyMeta, field, entityMeta);
   return propertyMeta;
 }
 /**
  * 関連を処理します。
  *
  * @param propertyMeta プロパティメタデータ
  * @param field フィールド
  * @param entityMeta エンティティメタデータ
  * @param annotation 関連のアノテーション
  */
 protected void doRelationship(
     PropertyMeta propertyMeta, Field field, EntityMeta entityMeta, Object annotation) {
   doJoinColumn(propertyMeta, field, entityMeta);
   if (OneToOne.class.isInstance(annotation)) {
     doOneToOne(propertyMeta, field, entityMeta, OneToOne.class.cast(annotation));
   } else if (OneToMany.class.isInstance(annotation)) {
     doOneToMany(propertyMeta, field, entityMeta, OneToMany.class.cast(annotation));
   } else if (ManyToOne.class.isInstance(annotation)) {
     doManyToOne(propertyMeta, field, entityMeta, ManyToOne.class.cast(annotation));
   } else {
     throw new UnsupportedRelationshipRuntimeException(
         entityMeta.getName(), propertyMeta.getName());
   }
 }
 public TableDesc getTableDesc(EntityMeta entityMeta, PropertyMeta propertyMeta) {
   GenerationType generationType = propertyMeta.getGenerationType();
   if (generationType == GenerationType.AUTO) {
     generationType = dialect.getDefaultGenerationType();
   }
   if (generationType == GenerationType.TABLE) {
     TableGenerator generator = getTableGenerator(entityMeta, propertyMeta);
     TableDesc tableDesc = new TableDesc();
     doName(entityMeta, tableDesc, generator);
     doPrimaryKeyColumn(entityMeta, tableDesc, generator);
     doValueColumn(entityMeta, tableDesc, generator);
     doUniqueConstraints(entityMeta, tableDesc, generator);
     return tableDesc;
   }
   return null;
 }
 /**
  * テーブルジェネレータを返します。
  *
  * @param entityMeta エンティティメタデータ
  * @param propertyMeta プロパティメタデータ
  * @return テーブルジェネレータ
  */
 protected TableGenerator getTableGenerator(EntityMeta entityMeta, PropertyMeta propertyMeta) {
   Field field = propertyMeta.getField();
   GeneratedValue generatedValue = field.getAnnotation(GeneratedValue.class);
   if (generatedValue == null) {
     throw new IllegalStateException("@GeneratedValue not found.");
   }
   String name = generatedValue.generator();
   if (StringUtil.isEmpty(name)) {
     return AnnotationUtil.getDefaultTableGenerator();
   }
   TableGenerator tableGenerator = field.getAnnotation(TableGenerator.class);
   if (tableGenerator != null && name.equals(tableGenerator.name())) {
     return tableGenerator;
   }
   tableGenerator = entityMeta.getEntityClass().getAnnotation(TableGenerator.class);
   if (tableGenerator != null && name.equals(tableGenerator.name())) {
     return tableGenerator;
   }
   throw new IllegalStateException("@TableGenerator not found.");
 }
Example #25
0
 @Override
 protected void prepareParams(final T entity) {
   for (final PropertyMeta propertyMeta : targetProperties) {
     final Object value = FieldUtil.get(propertyMeta.getField(), entity);
     addParam(value, propertyMeta);
   }
   for (final PropertyMeta propertyMeta : entityMeta.getIdPropertyMetaList()) {
     final Object value = FieldUtil.get(propertyMeta.getField(), entity);
     addParam(value, propertyMeta);
   }
   if (!includeVersion && entityMeta.hasVersionPropertyMeta()) {
     final PropertyMeta propertyMeta = entityMeta.getVersionPropertyMeta();
     final Object value = FieldUtil.get(propertyMeta.getField(), entity);
     addParam(value, propertyMeta);
   }
 }
 /**
  * 一対一の関連を処理します。
  *
  * @param propertyMeta プロパティメタデータ
  * @param field フィールド
  * @param entityMeta エンティティメタデータ
  * @param oneToOne 一対一関連
  */
 protected void doOneToOne(
     PropertyMeta propertyMeta, Field field, EntityMeta entityMeta, OneToOne oneToOne) {
   propertyMeta.setRelationshipType(RelationshipType.ONE_TO_ONE);
   Class<?> relationshipClass = field.getType();
   if (relationshipClass.getAnnotation(Entity.class) == null) {
     throw new RelationshipNotEntityRuntimeException(
         entityMeta.getName(), propertyMeta.getName(), relationshipClass);
   }
   propertyMeta.setRelationshipClass(relationshipClass);
   String mappedBy = oneToOne.mappedBy();
   if (!StringUtil.isEmpty(mappedBy)) {
     if (propertyMeta.getJoinColumnMetaList().size() > 0) {
       throw new BothMappedByAndJoinColumnRuntimeException(
           entityMeta.getName(), propertyMeta.getName());
     }
     propertyMeta.setMappedBy(mappedBy);
   }
 }
  /**
   * {@link ValueType}を処理します。
   *
   * @param propertyMeta プロパティメタデータ
   * @param entityMeta エンティティメタデータ
   */
  @SuppressWarnings("unchecked")
  protected void doValueType(final PropertyMeta propertyMeta, final EntityMeta entityMeta) {
    final Class<?> propertyClass = propertyMeta.getPropertyClass();
    final ValueType valueType = valueTypes.get(propertyClass);
    if (valueType != null) {
      propertyMeta.setValueType(valueType);
      return;
    }

    if (propertyClass == String.class) {
      if (propertyMeta.isLob()) {
        propertyMeta.setValueType(ValueTypes.CLOB);
      } else {
        propertyMeta.setValueType(ValueTypes.STRING);
      }
      return;
    }

    if (propertyClass == byte[].class) {
      if (propertyMeta.isLob()) {
        propertyMeta.setValueType(ValueTypes.BLOB);
      } else {
        propertyMeta.setValueType(ValueTypes.BYTE_ARRAY);
      }
      return;
    }

    if (propertyClass == Date.class) {
      switch (propertyMeta.getTemporalType()) {
        case DATE:
          propertyMeta.setValueType(ValueTypes.DATE_SQLDATE);
          return;
        case TIME:
          propertyMeta.setValueType(ValueTypes.DATE_TIME);
          return;
        case TIMESTAMP:
          propertyMeta.setValueType(ValueTypes.DATE_TIMESTAMP);
          return;
      }
    }

    if (propertyClass == Calendar.class) {
      switch (propertyMeta.getTemporalType()) {
        case DATE:
          propertyMeta.setValueType(ValueTypes.CALENDAR_SQLDATE);
          return;
        case TIME:
          propertyMeta.setValueType(ValueTypes.CALENDAR_TIME);
          return;
        case TIMESTAMP:
          propertyMeta.setValueType(ValueTypes.CALENDAR_TIMESTAMP);
          return;
      }
    }

    if (propertyClass.isEnum()) {
      if (propertyMeta.getEnumType() == null) {
        propertyMeta.setValueType(ValueTypes.getValueType(propertyClass));
        return;
      }
      switch (propertyMeta.getEnumType()) {
        case ORDINAL:
          propertyMeta.setValueType(ValueTypes.getEnumOrdinalValueType(propertyClass));
          return;
        case STRING:
          propertyMeta.setValueType(ValueTypes.getEnumStringValueType(propertyClass));
          return;
      }
    }

    final ValueType userDefinedValueType = ValueTypes.createUserDefineValueType(propertyClass);
    if (userDefinedValueType != null) {
      propertyMeta.setValueType(userDefinedValueType);
      return;
    }

    if (Serializable.class.isAssignableFrom(propertyClass)) {
      if (propertyMeta.isLob()) {
        propertyMeta.setValueType(ValueTypes.SERIALIZABLE_BLOB);
      } else {
        propertyMeta.setValueType(ValueTypes.SERIALIZABLE_BYTE_ARRAY);
      }
      return;
    }

    throw new UnsupportedPropertyTypeRuntimeException(
        entityMeta.getName(), propertyMeta.getName(), propertyMeta.getPropertyClass());
  }
 /**
  * <code>LOB</code>かどうかを処理します。
  *
  * @param propertyMeta プロパティメタデータ
  * @param field フィールド
  * @param entityMeta エンティティメタデータ
  */
 protected void doLob(
     PropertyMeta propertyMeta, Field field, @SuppressWarnings("unused") EntityMeta entityMeta) {
   propertyMeta.setLob(field.getAnnotation(Lob.class) != null);
 }
 /**
  * 一時的かどうかを処理します。
  *
  * @param propertyMeta プロパティメタデータ
  * @param field フィールド
  * @param entityMeta エンティティメタデータ
  */
 protected void doTransient(
     PropertyMeta propertyMeta, Field field, @SuppressWarnings("unused") EntityMeta entityMeta) {
   propertyMeta.setTransient(
       field.getAnnotation(Transient.class) != null || ModifierUtil.isTransient(field));
 }
 /**
  * {@link GenerationType#IDENTITY}方式で識別子の値を自動生成するIDジェネレータを処理します。
  *
  * @param propertyMeta プロパティメタデータ
  * @param entityMeta エンティティのメタデータ
  */
 protected void doIdentityIdGenerator(PropertyMeta propertyMeta, EntityMeta entityMeta) {
   propertyMeta.setIdentityIdGenerator(new IdentityIdGenerator(entityMeta, propertyMeta));
 }