BaseEntity.vmnetについて

32 views
Skip to first unread message

cuted...@gmail.com

unread,
Aug 21, 2020, 5:51:41 AM8/21/20
to DBFluteユーザの集い
志水です。
お世話になっております。

【環境】
 DBFlute.Net(dbflute-0.8.9.59)

BaseEntity.vmnetのAccessor設定の
#foreach ($col in $table.columns)ループ内で
versionnoのカラムかどうかを判断をしたいのですが
カラム名で判断する方法しかないのでしょうか?
他になにか方法はありますか?


以上、宜しくお願い致します。



kubo

unread,
Aug 21, 2020, 7:49:10 AM8/21/20
to DBFluteユーザの集い
jfluteです

志水さん、こんばんは

$col.isVersionNo() でどうでしょうか?

// Columnクラスの isVersionNo() メソッド
https://github.com/seasarorg/dbflute/blob/master/dbflute/src/main/java/org/apache/torque/engine/database/model/Column.java#L2617

Velociyのコードまで手を入れられているようでしたら、Github上のコードを参考にすると良いです(^^。
https://github.com/seasarorg/dbflute

cuted...@gmail.com

unread,
Aug 21, 2020, 12:17:45 PM8/21/20
to DBFluteユーザの集い
志水です。

jfluteさん
こんばんはーー


> $col.isVersionNo() でどうでしょうか?
おーー、Tableは見かけてたんですが 
$colもあったんですね。
ありがとうございます。
試してみます。。


以前、.NetCoreでDBFluteを利用できないかの投稿ではお世話になりました。
現在、新案件の基盤をBlazorで構築中です。
当初はWebassemblyと思ってましたが新しすぎて文献などほぼ見当たらなく
セキュリティなど も問題ありそうなのでHost側稼働のBlazorで留めました。。

結局、あれから良い情報も得られずDBFlute全てを利用するのは無理と判断しました。
しかし、今後、もしかするともしかしたらぁ
Core版のDBFluteが誕生するんじゃあないかって期待(笑)しつつ
構築中のBlazor基盤では、
Dapper(読み込み用)とEntityFramework(更新専用)を想定しており
BaseEntity、Entiyと定数定義に重宝したCDefとその関連付けclassificationDeploymentMap.dfprop 
だけでも利用できたらと考えてます。
まぁ全てのDBFlute機能は利用できないですけどDBアクセス部分だけ自作で作っておけば
あとはEntiy とCDef周りとDB定義書が生成して利用できるようにするだけでも
だいぶん楽になりますからねーー

とりあえず、今質問しているVersionカラムに付加する
EntityFramework用の排他制御用アノテーション以外のところは
動作確認ができましたので$col.isVersionNo() を利用することで
万事解決できそうですねー。

最初はできるかなぁと思って中身を見てましたが
以前にjfluteさんにお助けを頂きながらTemplateを弄って
機能追加した経験が幸いしてなんとなく理解できるようになってました。。
 
まだまだ、DBfluteを使うことができそうでよかったです(^^)



2020年8月21日金曜日 20:49:10 UTC+9 jflute:

cuted...@gmail.com

unread,
Aug 25, 2020, 2:06:54 AM8/25/20
to DBFluteユーザの集い
志水です。

jfluteさん
こんにちは。

$col.isVersionNo() でうまくいきました。
ありがとうございました。

 

2020年8月22日土曜日 1:17:45 UTC+9 cuted...@gmail.com:

kubo

unread,
Aug 25, 2020, 3:02:49 AM8/25/20
to DBFluteユーザの集い
jfluteです。志水さん、ご連絡ありがとうございます。
うまくいって良かったです。


あと、Blazorの案件の共有もありがとうございます。
DBFluteが汎用的な自動生成ツールとしても活躍できると嬉しいですね。

自分も大昔、DBFluteが使えない現場で、テンプレートをいじってちょこっと自動生成ツールとして使ったことあります。
またわからないことがありましたら、ぜひ聞いてくださいね(^^。

cuted...@gmail.com

unread,
Aug 26, 2020, 3:12:28 AM8/26/20
to DBFluteユーザの集い
志水です。

jflute さん、こんにちは。

DBアクセス周りは参照、更新はうまく動作して
CDefの生成もできました。
実行するとCDefで定義したものが参照、取得できました。

次に
classificationDeploymentMap.dfprop  に
map:{
     ;$$ALL$$ = map:{

         ;role=ROLE_ID
     }
の関連付けを行って生成すると、コード上では利用できるようになっておりました。
早速、Setで設定できるかとかIs系で判断が正しくできるのかテストしようと
実行したのですが、DB接続しようとした直後に以下のエラーが発生してしまいます。(詳細添付)
  Message=No suitable constructor found for entity type 'ROLE'. The following constructors had parameters that could not be bound to properties of the entity type: cannot bind 'code', 'name', 'alias' in 'ROLE(string code, string name, string alias)'.

今回、DBFLuteの生成するモジュールでCBean関連等々、不要と思われるものを削ったのですが削りすぎたのでしょうか??
それとも、EntityFrameworkCoreの絡みなのか。
このようなエラーがでるような原因とか
何か、お気づきの点がございましたら教えてください。

以上、宜しくお願い致します。



2020年8月25日火曜日 16:02:49 UTC+9 jflute:
変更箇所とエラー.zip

kubo

unread,
Aug 26, 2020, 6:05:59 AM8/26/20
to DBFluteユーザの集い
jfluteです

> Message=No suitable constructor found for entity type 'ROLE'. The following constructors had parameters that could not be bound to properties of the entity type: cannot bind 'code', 'name', 'alias' in 'ROLE(string code, string name, string alias)'.

エラーが発生したときは、そのエラーを誰が発生させているのか?を見ると良いです。
スタックトレースかなにかはないですか?

メッセージを読むと...
RoleというEntity型のコンストラクターがダメぴょんということで...
バインドできないパラメーターがコンストラクターにあるよと。

EntityFrameworkCoreの仕様がわからないのでなんともですが、
CDefクラスがEntityとして扱われてること自体が「いいのかな?」って気はします。
CDefはあくまでプロパティ型なので。

cuted...@gmail.com

unread,
Aug 26, 2020, 9:58:30 PM8/26/20
to DBFluteユーザの集い
jfluteさん 
こんにちは。

志水です。

>CDefクラスがEntityとして扱われてること自体が「いいのかな?」って気はします。
>CDefはあくまでプロパティ型なので。  
[NotMapped]アノテーションで除外する対処をしていたのですが
エラーがとれず自分の対処の仕方が違うのか??と思ってしまってました。

回答内容を見て、やはりこれが原因と思い
よくよく生成されたクラスを見てみると、対処漏れがあったようでして
再度、漏れなくCDef関連のプロパティに[NotMapped]対処したら
エラーが消えました。
★必要な箇所は以下の箇所のプロパティ全てに必要でした。
 Classification Property <--ココだけ対処していました。
 Classification Determination 
 Classification Name/Alias

これが使えないとツライと焦ってしまいました。
よかったよかった( ´Д`)=3 フゥ
ありがとうございました。


2020年8月26日水曜日 19:05:59 UTC+9 jflute:

kubo

unread,
Aug 26, 2020, 10:14:48 PM8/26/20
to DBFluteユーザの集い
jfluteです

おお、なるほど、明示的にマッピング対象除外するわけですね。
解決して良かったです。

cuted...@gmail.com

unread,
Aug 31, 2020, 11:11:12 PM8/31/20
to DBFluteユーザの集い
志水です。
こんにちは。

SQL生成までできないかなと
少し欲がでてきたのですが(笑)
でもできるかな??どうなんだろうと思いつつ
すこし、ソースを見たのですが
CBean周りにちょこちょことSeasarの影がみえるので
さすがに、Seasar使わずには無理ですよね?
あと絶対に難易度も高めですよね?



2020年8月27日木曜日 11:14:48 UTC+9 jflute:

cuted...@gmail.com

unread,
Sep 1, 2020, 3:55:17 AM9/1/20
to DBFluteユーザの集い
志水です。

jflute さん
こんにちは。 

難易度高そうでしたがちょっとチャレンジしてみたのですが
Exception系やLog4系などの部分はコメントアウトなどで対処できましたが
やはり、最後に
ConditionBeanContextクラスの
        public static String ConvertConditionBean2DisplaySql(ConditionBean cb) {
            String twoWaySql = cb.SqlClause.getClause();
            return InternalSqlParser.ConvertTwoWaySql2DisplaySql(twoWaySql, cb);
        }
ここの部分からはSeasar関連が必要みたいですね。
ここが一番欲しかったところなんですけどねー。。。





2020年9月1日火曜日 12:11:12 UTC+9 cuted...@gmail.com:

kubo

unread,
Sep 1, 2020, 4:24:28 AM9/1/20
to DBFluteユーザの集い
jfluteです


ConditionBean自体はSQLを組み立てるだけで独立はしています。
厳密には、2WaySQLを生成します。

その生成された2WaySQLをBehaviorとその奥のS2Dao.NETが実行します。

そういう意味では、SQLの組み立てだけはConditionBeanを真似るかコピーするかでいけそうですが...
2WaySQLの解釈で、S2Dao.NETのクラスに依存するかもですね。

> return InternalSqlParser.ConvertTwoWaySql2DisplaySql(twoWaySql, cb);

これはあくまで DisplaySql の生成なので、厳密には実行用のSQLを組み立ててるわけではないですが...
これも SqlParser を使っていますね。


一方で、Internal って付いているクラスは、おそらくDBFlute.NET側で保持しているクラスなので、それはそのまんま持ってこれるかもしれません。
ただ、その Internal のクラスの中で、S2Dao.NET に依存している部分はあるかもしれません。。。


アプリケーションでどのくらいの難度のSQLを発行するのか?次第ですが、
ConditionBeanのフル機能じゃなく、ちょっと単純なSQLを自動で作るだけとかであれば、
コピーせずに0から作っちゃったほうがいいかもですね。(それでも大変かもですけど(^^)

cuted...@gmail.com

unread,
Sep 1, 2020, 5:40:16 AM9/1/20
to DBFluteユーザの集い
志水です。

>一方で、Internal って付いているクラスは、おそらくDBFlute.NET側で保持しているクラスなので、それはそのまんま持ってこれるかもしれません。

>ただ、その Internal のクラスの中で、S2Dao.NET に依存している部分はあるかもしれません。。。  
Internalの必要そうなところを生成してみたのですが、手に負えなそうもなく・・・orz

>アプリケーションでどのくらいの難度のSQLを発行するのか?次第ですが、
>ConditionBeanのフル機能じゃなく、ちょっと単純なSQLを自動で作るだけとかであれば、
>コピーせずに0から作っちゃったほうがいいかもですね。(それでも大変かもですけど(^^)  
Dupperはカラム名「user_name 」➡Entityのプロパティ「UserName」に
自動でデータをセットしてくれるんですよね。
それもDBFluteみたいにSetupSelectしたときと同じように
多少の実行コーディングは必要でけど  
Joinしたテーブルも含めてデータを
Entityにセットすることができるんですよ。
なので2WaySQLの生成は無理でも
せめて値バインド前のSQL生成までできたらと欲がでてしまいました(笑)

下記が実行して生成したものなのですが
下記の問題が解消されたらSQL生成部分も使えそうなんですが
どのへんで作っているのかお判りになりますか?
1.「dflocやdfrel_0はそのままテーブル名」にしたい
2.「as c0など別名への変換」「\n」が不要
3.「/*pmb.ConditionQuery.Id.Equal*/null」を「@id」にしたい

select  dfloc.id as c0, dfloc.user_name as c1, 
dfloc.password_hash as c2, dfloc.session_id as c3, dfloc.role as c4, 
dfloc.password_upddate as c5, dfloc.version_no as c6, 
dfloc.register_user as c7, dfloc.register_datetime as c8, 
dfloc.register_process as c9, dfloc.update_user as c10, 
dfloc.update_datetime as c11, dfloc.update_process as c12\n     , 
dfrel_0.role as c13, dfrel_0.name as c14, dfrel_0.version_no as c15, dfrel_0.register_user as c16, 
dfrel_0.register_datetime as c17, dfrel_0.register_process as c18, dfrel_0.update_user as c19, 
dfrel_0.update_datetime as c20, dfrel_0.update_process as c21 \n  
from m_user dfloc\n    
left outer join m_role dfrel_0 on dfloc.role = dfrel_0.role \n where dfloc.id = /*pmb.ConditionQuery.Id.Equal*/null



以上、宜しくお願い致します。


2020年9月1日火曜日 17:24:28 UTC+9 jflute:

cuted...@gmail.com

unread,
Sep 1, 2020, 6:52:12 AM9/1/20
to DBFluteユーザの集い
志水です。

よく考えたらdflocとかDB別名は必要でした。
とりあえず、単純なJoinまではできたみたいです(/・ω・)/
もう少し複雑なQuery書いてテストしみます。
また、不明な点があったら質問しちゃうかもです。
ありがとうございました。
select dfloc.id, dfloc.user_name, dfloc.password_hash, dfloc.session_id, dfloc.role, dfloc.password_upddate, dfloc.version_no, dfloc.register_user, dfloc.register_datetime, dfloc.register_process, dfloc.update_user, dfloc.update_datetime, dfloc.update_process\n     , dfrel_0.role, dfrel_0.name, dfrel_0.version_no, dfrel_0.register_user, dfrel_0.register_datetime, dfrel_0.register_process, dfrel_0.update_user, dfrel_0.update_datetime, dfrel_0.update_process \n  from m_user dfloc\n    left outer join m_role dfrel_0 on dfloc.role = dfrel_0.role \n where dfloc.id = @id


2020年9月1日火曜日 18:40:16 UTC+9 cuted...@gmail.com:

kubo

unread,
Sep 4, 2020, 12:57:14 AM9/4/20
to DBFluteユーザの集い
jfluteです

すごい、けっこうSQL生成できてますね!そこまで進んでいたと想像していませんでした(^^。

> また、不明な点があったら質問しちゃうかもです。

ぜひぜひ。「O/Rマッパー作り」こそ、ぼくの専門ですから笑
Reply all
Reply to author
Forward
0 new messages