mappingToDtoを特定条件下で使うとnullが返る

29 views
Skip to first unread message

jet

unread,
Oct 8, 2020, 12:32:10 AM10/8/20
to DBFluteユーザの集い
お世話になります。

jetと申します。

entity→dtoの変換時に特定条件下でnullが返ってくる現象があります。

この現象について
・dtoMapperの仕様なのでしょうか
・回避策などはありますでしょうか

ご教授願えますでしょうか。

○サンプルコード
 // .. 実際には様々な条件を設定  
OptionalEntity<MaMenu> optMaMenu = maMenuBhv.selectByPK(5L);
MaMenu maMenu = optMaMenu.get();

//この処理が特殊だと思われる
maMenuBhv.loadMaApp(maMenu, cb -> {
    cb.setupSelect_MaMenu();
});

//以下のようなコードは問題ない
for(MaApp maApp : maMenu.getMaAppList()) {
    MaMenu maMenuEntity = maApp.getMaMenu().get(); 
}

//以下のようなコードで maMenuDto がnullになる
MaMenuDto menu = maMenuDtoMapper.mappingToDto(maMenu);
for(MaAppDto maAppDto : menu.getMaAppList()) {
    MaMenuDto maMenuDto =  maAppDto.getMaMenu(); 
}

○ER図イメージ
テーブル構成の概要は以下のような感じになっています。

・MaMenu 
- - - - - - - - -
menu_id      PK
menu_name      

・MaApp
- - - - - - - - -
app_id      PK
menu_id     FK
app_name     

MaMenu:MaAppは1:nになっています

kubo

unread,
Oct 8, 2020, 1:01:32 AM10/8/20
to DBFluteユーザの集い
jfluteです、jetさん、こんにちは

one-to-many の many 側の one に対する逆参照が、マッピングされてないってことですかね。

DtoMapperのソースコードを読んでみました。
ちょっと、こちらのメソッドを呼び出して試してみてください。
dtoMapper.setReverseReference(true)


> maMenuBhv.loadMaApp(maMenu, cb -> {
> cb.setupSelect_MaMenu();
> });

ちなみに、LoadReferrerでloadした子テーブルリスト、基点の親テーブルの参照を持つはずなので、
LoadReferrerでの基点の親テーブルに対するsetupSelectは無くても大丈夫なはずです。

jet

unread,
Oct 8, 2020, 3:46:17 AM10/8/20
to DBFluteユーザの集い
お世話になります

jetと申します


dtoMapper.setReverseReference(true)
を呼び出しておくと解決しました!

ありがとうございます。

早々にご対応いただきありがとうございます!

2020年10月8日木曜日 14:01:32 UTC+9 jflute:

kubo

unread,
Oct 8, 2020, 4:14:00 AM10/8/20
to DBFluteユーザの集い
jfluteです

おお、良かったです。

一応、DtpMapperの仕様としては...

DtoMapperは、デフォルトでは逆参照は付与せず、オプションで逆参照をマッピングできるという感じですね。
逆参照はそんなに利用頻度も高くないので、デフォルトではマッピングコストを回避していてます。
Reply all
Reply to author
Forward
0 new messages