テーブル定義書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文生成するツール使えばいいんだけどね。