HibernateTool - Gen Schema

記載遇到過的問題。

Oracle - timestamp -> date

使用org.hibernate.dialect.OracleDialect會將timestamp轉為date,而date精準度不足。
Root cause為registerColumnType將timestamp設為date,

	public OracleDialect() {
		super();
		LOG.deprecatedOracleDialect();
		// Oracle8 and previous define only a "DATE" type which
		//      is used to represent all aspects of date/time
		registerColumnType( Types.TIMESTAMP, "date" );
		registerColumnType( Types.CHAR, "char(1)" );
		registerColumnType( Types.VARCHAR, 4000, "varchar2($l)" );
	}
解法有二,一個是直接使用Oracle9Dialect或自己寫一個Dialect,其中registerColumnType寫為
registerColumnType( Types.TIMESTAMP, "timestamp" );

Reference

Mysql - timestamp(3) -> timestamp

Mysql從5.6開始支援秒的小數位,精準度到6位,但透過Hibernate轉換無法轉出對應的小數位宣告。
解法為Override MySql的Dialect:

public class MySQL564PlusDialect extends MySQL5Dialect {
   public MySQL564PlusDialect() {
      super();
      registerColumnType( Types.TIMESTAMP, 6, "datetime($l)" );
   }
}
也可以等它把solution寫好8-)

Reference