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 を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 もデフォルト値をセットしておいた。
やっぱり公式ちゃんと見ないとね。