Skip to main content

MyBatis Generatorの生成されたモデルでblobが分離される

· 3 min read

MyBatis Generator を使って、コードを自動生成したところ、DB 上で text 型のカラムが分離されて他クラスに居たので、 なぜだろうと思って調べたメモ。

DB は MySQL を使用。

comment テーブルを例にとって。このテーブルには 3 カラムだけ。

カラム名型説明
idbigint(PK)プライマリーキー
userIdbigint(index)ユーザ ID
texttext 型コメント内容

どうやら MySQL 上で text 型や PK のカラムは、コード自動生成後別クラスのモデルにされるらしい。 例えば以下自動生成されたコメントクラス

public class Comment extends CommentKey implements Serializable {
private Long userId;
}

おや、userId しかない。PK の id とか text カラムは?

CommentKeyこれを継承しているよう。

CommentKey クラスを見てみると

public class CommentKey implements Serializable {
private Long id;
private static final long serialVersionUID = 1L;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
}

なるほど PK はなぜか別クラスになっているらしい。

そして、text カラムはどこにいったかと言うと、

CommentWithBLOBs クラス

public class CommentWithBLOBs extends Comment implements Serializable {
private String text;
private static final long serialVersionUID = 1L;
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}

テキスト型のカラムは、〇〇 WithBLOBs クラスになるっぽい。

で、Comment を継承しているので、すべてのカラムの情報を取得する場合は、

CommentWithBLOBsクラスを使えば良さそう。

でも、Mapper の方にもちょっと問題があって、

PK(今回は long 型の id)を指定して、データを取得するとき、 long 型の id をCommentMapperのselectByPrimaryKey に与えられないっぽい。なぜなら。

 CommentWithBLOBs selectByPrimaryKey(CommentKey key);

こんな感じで、long 型ではなく、CommentKey 型を期待しているから。

ちょっと面倒なので、MyBatis Generator の設定を見直す。

generator_config.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<context id="schema" defaultModelType="hierarchical">
// 以下省略

設定はどこからコピって来たので、あまり気にしてはいなかった。 どうも、defaultModelTypeが怪しそうなので、調べてみると。

このプロパティは生成方法らしい。 以下公式。 [http://www.mybatis.org/generator/configreference/context.html]

3 つくらいあるが、hierarchicalを明示的に指定していたため、〇〇 Key や〇〇 WithBlobs クラスが出来ていた。

シンプルが楽なので、デフォルトにしてやることにした。↓

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<context id="schema" defaultModelType="conditional" targetRuntime="MyBatis3">
// 以下省略

指定しなくても、デフォルト値なので一緒だが明示的にね。 あと、今回関係ないが targetRuntime もデフォルト値をセットしておいた。

やっぱり公式ちゃんと見ないとね。