在反向工程中将Oracle类型TimestampWithTimezone和TimestampWithLocalTimeZone映射到Hibernate类型

时间:2015-07-10 13:56:28

标签: java oracle hibernate mapping hibernate-tools

我有一个包含三列的表,其中sql类型为TimeStamp,TimeStampWithTimeZone和TimeStampWithLocalTimeZone。

在休眠逆向工程过程中,

  

TimeStamp 已正确映射到时间戳

     

TimeStampWithTimeZone TimeStampWithTimeZone 映射到可分割,期望两者都映射到 TimeStamp

在浏览了这个link之后,我在hibernate.reveng.xml中添加了以下映射。

<sql-type jdbc-type="OTHER" hibernate-type="java.sql.Timestamp" />

但我仍然将它映射到Seralizable。任何人都面临这个问题吗?

1 个答案:

答案 0 :(得分:0)

通过扩展默认的RevengNamingStrategy来解决它。

方法: TIMESTAMP_WITH_TIMEZONE和TIMESTAMP_WITH_LOCAL_TIMEZONE类型的Sql类型是-101和-102,因为这些类型的 java.sql.Types 中没有hibernate映射类型,因此它们映射到可以集中化。

所以写了我自己的RevengNamingStrategy,它将这些类型转换为Timestamp.Which实习生转换为hibernate TimeStampType。

public class OracleRevengNamingStrategy extends DefaultRevengNamingStrategy {

    private static final Integer TIMESTAMP_WITH_TIMEZONE_SQL_CODE = -101;

    private static final Integer TIMESTAMP_WITH_LOCAL_TIMEZONE_SQL_CODE = -102;


    public OracleRevengNamingStrategy(ReverseEngineeringStrategy delegate) {
        super(delegate);
    }

    // Converts Timestamp with tomezone and Time stamp with local time zone to Timestamp
    @Override
    public String columnToHibernateTypeName(TableIdentifier table, String columnName, int sqlType, int length, int precision, int scale,
                                            boolean nullable, boolean generatedIdentifier) {
        String type;

        if (sqlType == TIMESTAMP_WITH_TIMEZONE_SQL_CODE || sqlType == TIMESTAMP_WITH_LOCAL_TIMEZONE_SQL_CODE) {
            type = "timestamp";
        } else {
            type = super.columnToHibernateTypeName(table, columnName, sqlType, length, precision, scale, nullable, generatedIdentifier);
        }

        return type;
    }

}

如果有任何其他方法可以解决此问题,请告诉我。