mysql generated colmun

7 views
Skip to first unread message

mokkouyou

unread,
Jun 5, 2026, 2:08:29 AM (23 hours ago) Jun 5
to DBFluteユーザの集い
お世話になっております。mokkouyouです。

さて、mysqlのgenerated colmunですが、以下のように整理されているようですが
レコード複写の際に、selectしてpkクリア、必要な値を設定してinsertとすると、
generated colmunもinsert対象にマーキングされてしまいエラーとなります。

mymodifyPropertyCancelなどでinsert直前で除外すればいいかな?と思いましたが、これでは制御できないようでした(これできればexでsetterオーバライドしておけば安全かな?と思ったのですが)

どのようにすればinsert対象から除外できるでしょうか?
(取得の際にspecifyはあっても共通カラムなど以外の除外はないようですしそちらでは制御ではなさそう)

#最悪の場合、手動でコピーするように直すというのも1つかと思いますが、カラム追加時などの対応漏れも怖いので現状の複写処理の仕組みは残しておきたいです。

私の方でもinsert処理の中追って何かヒントないか調べてみようかと思いますが、もし標準というか、何か手段があればご教授いただければ幸いです。

以上よろしくお願いいたします。

kubo

unread,
Jun 5, 2026, 2:47:32 AM (22 hours ago) Jun 5
to dbf...@googlegroups.com
jfluteです。

mokkouyouさん、こんにちは。

なるほど、コピーinsertのときですね。
この後MTG続きなので、後で実験してみます。

mokkouyou

unread,
Jun 5, 2026, 4:52:44 AM (20 hours ago) Jun 5
to dbf...@googlegroups.com
jfluteさん

mokkouyouです。
お願いしますー

ちらっと調べましたがinsertOptionとかでも除外できなそうですし、Dbmから取得したカラム情報をもとにリフレクションなりで値移し替える処理挟む方がシンプルかもなんて思い始めたりしています。

#erfluteでもちょっと力技感ありますし、triggerの方が無難なのかなぁ、、、



2026年6月5日(金) 15:47 kubo <dbf...@gmail.com>:
--
このメールは Google グループのグループ「DBFluteユーザの集い」に登録しているユーザーに送られています。
このグループから退会し、グループからのメールの配信を停止するには dbflute+u...@googlegroups.com にメールを送信してください。
このディスカッションを表示するには、https://groups.google.com/d/msgid/dbflute/CAALfU-D9pmQ_6NCG37YRT8C%3DiLh-ONG1xewRLwtkq_XBNTmLTg%40mail.gmail.com にアクセスしてください。

kubo

unread,
Jun 5, 2026, 6:11:03 AM (19 hours ago) Jun 5
to dbf...@googlegroups.com
jfluteです。

selectされたEntityって、modifiedProperties情報は空っぽで、
代わりに createdBySelect が true になって、そして、全カラム列挙になるんですよね。
(TnInsertEntityDynamicCommand.java にて)

なので、modifiedProperties を cancel してもあまり意味がないと。

そしてまさしく、varyingInsert() の InsertOption を使えば、
対象カラムを制御できるのですが、列挙式になるので、
以下のようにループで除外するみたいになってしまいます。
(dbmetaでリフレクションは無しでも実現はできます)


Member member = memberBhv.selectByPK(1).get();

MemberDbm memberDbm = MemberDbm.getInstance();
ColumnInfo birthdateCol = memberDbm.columnBirthdate(); // generated column
memberBhv.varyingInsert(member, op -> op.specify(cb -> {
    List<ColumnInfo> columnInfoList = memberDbm.getColumnInfoList();
    for (ColumnInfo columnInfo : columnInfoList) {
        if (columnInfo.equals(birthdateCol)) {
            continue;
        }
        cb.invokeSpecifyColumn(columnInfo.getPropertyName());
    }
}));

該当箇所が少なければ、上記のやり方で回避するって感じが一番現実的かもですね。


DBFluteとしては、実際にありえるケースなんだ、ってことがわかったので、
イシュー #239 をちゃんとやっていかなとなーと思った次第で。

generated column をdfpropでベタに指定してもらって、
insert対象から外す処理を入れるとか...



mokkouyou

unread,
Jun 5, 2026, 6:33:24 AM (18 hours ago) Jun 5
to dbf...@googlegroups.com
jfluteさん

ありがとうございます。
奇しくもcopyメソッド作る方向で考えたのと同じような感じの処理ですね。(exentityにコピーメソッドとして用意して必要なところで噛ませようかなと)

他に同等の処理してるところ探してみないとアレですがたぶんupdateで該当するパターンはないでしょうし、InsertOptionで切出すせば共通化の問題も無さそうですねー(insertOrUpdateでもきっと問題ないのかなと)
ちょっと教えていただいた方法で対処検討してみます。
ありがとうございました。




2026年6月5日(金) 19:11 kubo <dbf...@gmail.com>:
--
このメールは Google グループのグループ「DBFluteユーザの集い」に登録しているユーザーに送られています。
このグループから退会し、グループからのメールの配信を停止するには dbflute+u...@googlegroups.com にメールを送信してください。
このディスカッションを表示するには、https://groups.google.com/d/msgid/dbflute/CAALfU-B0wDDfOYTrcLVeoKAZrrMY-PCFCD3t7Pat2gnDPmTFrQ%40mail.gmail.com にアクセスしてください。
Reply all
Reply to author
Forward
0 new messages