iku8blog - 考えない為に考える

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

date: 2019-07-08

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

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

date: 2019-07-08