iku8log

Webエンジニアのタダのメモ。

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

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

DBはMySQLを使用。

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

カラム名 説明
id bigint(PK) プライマリーキー
userId bigint(index) ユーザID
text text型 コメント内容

どうやら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をCommentMapperselectByPrimaryKey に与えられないっぽい。なぜなら。

 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もデフォルト値をセットしておいた。

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