テーブル定義書CSVからS2JDBC用のEntityクラスを生成する(自分メモ)

こんなテーブル定義(CSV)をもとにEntityクラスを作るとき。

  • 論理項目名、物理項目名、データ型、サイズ、NOT NULL制約、主キー
  • 今回ファイル名は「User.csv」とする
"ユーザID","user_id","varchar","11","○","○"
"名前","name","varchar","8","○",""
"年齢","age","integer","","",""
"mail","mail","varchar","255","",""

スクリプトは以下のような感じ。CLASS_NAMEとTABLE_LOGICAL_NAMEを設定して実行するだけ。CLASS_NAMEはCSVにつけた名前と一致させとく。

require 'csv'

CLASS_NAME = 'User'
TABLE_LOGICAL_NAME = 'ユーザマスタ'

open("#{CLASS_NAME}.java", "w") {|dest|

  dest.write("package sample.entity;\n\n")
  dest.write("import java.io.Serializable;\n")
  dest.write("import java.math.BigDecimal;\n")
  dest.write("import java.sql.Timestamp;\n")
  dest.write("import javax.persistence.Column;\n")
  dest.write("import javax.persistence.Entity;\n")
  dest.write("import javax.persistence.Id;\n\n")
  
  dest.write("/** #{TABLE_LOGICAL_NAME} */\n")
  dest.write("@Entity\n")
  dest.write("public class #{CLASS_NAME}  implements Serializable {\n\n")
  dest.write("\tpublic static final long serialVersionUID = 1L;\n\n")
  CSV.open("#{CLASS_NAME}.csv", 'r') do |row|
    logical_name = row[0]
    name_array = row[1].split('_')
    name_array[1,name_array.size].each {|v|
    	v[0..0] = v[0..0].upcase
    } if name_array.size > 1
    phys_name = name_array.join
    
    java_type = ''
    data_type = row[2] # データ型
    data_length = row[3] # サイズ
    is_not_null = row[4] # NOT NULL制約
    primary_key = row[5] # 主キー
    case data_type
      when 'varchar'
        java_type = 'String'
        length = "length = #{data_length}, "
      when 'timestamp'
        java_type = 'Timestamp'
      when 'integer'
        java_type = 'Integer'
      when 'numeric'
        java_type = 'BigDecimal'
        h = data_length.split(',')
        precision = h[0]
        scale = h[1] || 0
        length = "precision = #{precision}, scale = #{scale}, "
    end
    
    # NOT NULL属性
    nullable = (is_not_null == '' ? false : true)
    
    dest.write("\t/** #{logical_name} */\n")
    if primary_key == ''
      dest.write("\t@Id\n")
    end
    dest.write("\t@Column(#{length}nullable = #{nullable}, unique = false)\n")
    dest.write("\tpublic #{java_type} #{phys_name};\n")
  end
  dest.write("}")
}

あくまで自分用メモです。今回必要だったところにしか対応していないので、スクリプトには本来必要はデータ型とか抜けてたり、unique制約はつねにfalseだったりします。というか、テーブル定義書からCREATE文生成するツール使えばいいんだけどね。