「kaz_javaSpringBootプログラム自動作成◎生成ツール」_バグ修正と説明追加
「kaz_javaSpringBootプログラム自動作成◎生成ツール」java ,SpringBoot
https://www.vector.co.jp/soft/winnt/prog/se523123.html
のバグ修正と説明追加が完了した。本日VectorにVer1.6(202112100000)で登録依頼する。OKがきたらまた報告する予定。
修正履歴は以下のようになる。
・1.6(202112100000)
1.「javaSpringBootプログラム作成マクロ.xlsm」・「ReadMe」シートの以下記述を修正した。
--------------------------------------------------------------------------------------------------------------------------
「kaz_javaSpringBootプログラム作成ツール」の導入手順、定義ファイル説明
<<追加 start>>
↑画像付き説明は以下シートを見てください。
・「ReadMe補足:自動作成したPGMサンプルを動かすときは」シート。手順01~手順02、手順08~手順13が理解できます。
・「ReadMe補足 定義ファイル」シート。「手順03」~「手順08」及び『「javaSpringBootテーブル項目一覧などの定義.xlsm」のシートの定義について』が理解できます。
<<追加 end>>
--------------------------------------------------------------------------------------------------------------------------
1 手順01.PC設定
Spring BootでWEB開発するための環境を作ってください。
前述「私のSpring Boot+thymeleaf環境」に合わせてもらえれば良いと思います。
<<追加 start>>
補足:STS4、apache-maven 3.6.3、JDK JavaSE-13、MySql 10.4.14-MariaDBの導入は必須です。
その他はPOM.xmlにより自動設定されるので気にしないでOKです。
<<追加 end>>
・・・当ツールはPGMコードを作成することを目的としていて、環境はすでにできていることを前提にしています。
--------------------------------------------------------------------------------------------------------------------------
手順04.「コード一覧表」シートに、選択プルダウンやラジオボタンなどのコードを設定してください。
<<修正前>>
・現在入っている「10.ary_lrgmidsml_category」「11.ary_lrgmidsml_biztype」はDBエレメントのサンプルなので、削除しても大丈夫です。
<<修正後>>
・現在入っている「10.ary_lrgmidsml_category」~「15.ary_lrgmidsml_purchase_hist」はDBエレメントのサンプルなので、削除しても大丈夫です。
--------------------------------------------------------------------------------------------------------------------------
「javaSpringBootテーブル項目一覧などの定義.xlsm」のシートの定義について
・・・
検索項目一致条件(P列10行から)
<<修正前>>
・「検索ラジオボタン・入力プルダウン」、「検索チェックボックス・入力プルダウン」、
「検索プルダウン・入力ラジオボタン」、「検索・入力ラジオボタン」、「検索・入力プルダウン」、「検索・入力プルダウン」、
「メールアドレスの書式」のときは検索項目一致条件に「FromTo」を指定できません、
強制的に「完全一致」に書き換えます。
<<修正後>>
・同上、
同上、「検索・入力ajax」、
同上、
同上
2.「javaSpringBootプログラム作成マクロ.xlsm」に「ReadMe補足 定義ファイル」シートを追加した。これによりツールに対する理解が深まることを期待している。
3.「javaSpringBootテーブル項目一覧などの定義.xlsm」・「コード一覧」シート
--------------------------------------------------------------------------------------------------------------------------
I列(テーブル略名)を空白にした。
理由:各テーブル定義のテーブル略名を使用してPGMを作成していて、ここに定義したテーブル略名は使用していないため。
--------------------------------------------------------------------------------------------------------------------------
4行目
注意)・コードIDは英数字とアンダースコアのみ使用してください。
KEY項目IDが、テーブルIDと同じ場合、強制的に、KEY項目ID+”_cd”に書き換えられます。
・分類名の項目ID(K列)に同じ名前の登録があると自動作成後のPGMでエラーになります。
<<修正前>>
テーブル項目名を修正して下さい。
<<修正後>>
テーブル項目名を修正して下さい。(名前だからと言って、各テーブル同じnameではダメということ。)
4.「javaSpringBootテーブル項目一覧などの定義.xlsm」に項目チェック内容=”検索・入力Ajax”のサンプルを追加した。
・「javaSpringBootテーブル項目一覧などの定義.xlsm」の「使用できる項目」シートの38行目に
item31(検索・入力Ajax(業種ID))を項目チェック内容=”検索・入力Ajax”として追加した。
5.バグ修正
■以下の時、入力エラーが起きると例外が発生する。または、行追加、行削除を行うと例外が発生する。修正する
修正 例:SubcategoryController.java 中分類情報管理・中分類情報変更・小分類情報一覧登録
理由:subcategoryFormのCategoryCdObjがnullになっているため、
subcategoryAmendRegister.htmlの「<td th:text="*{categoryCdObj.catname}">catname</td>」で例外発生
修正箇所:
----
private String extracategoryListAdd(SubcategoryJoinPForm subcategoryJoinPForm,
BindingResult result,
String mode,
String addNum,
Model model) {
//エラーになったときのモードを設定
model.addAttribute("mode", mode);
<<追加 start>>
subcategoryService.setDbEleObjForSubcategoryForm(subcategoryJoinPForm);
<<追加 end>>
----
private String extracategoryListDel(SubcategoryJoinPForm subcategoryJoinPForm,
BindingResult result,
String mode,
String num,
Model model) {
//エラーになったときのモードを設定
model.addAttribute("mode", mode);
<<追加 start>>
subcategoryService.setDbEleObjForSubcategoryForm(subcategoryJoinPForm);
<<追加 end>>
----
@PostMapping(params="mode=upd_do")
public String subcategoryUpdDo(@Validated({GroupOrder1.class, GroupOrder2.class}) SubcategoryJoinPForm subcategoryJoinPForm,
・・・
if (result.hasErrors()) {
<<追加 start>>
subcategoryService.setDbEleObjForSubcategoryForm(subcategoryJoinPForm);
<<追加 end>>
//何かしらの入力エラーがあった場合"itemErrorMessages"にエラー内容を入れる
setAddNumMapForAttribute(model, subcategoryJoinPForm);
■親子テーブル変更画面(1つの子供データが2行表示のパターン)で子供データを削除すると画面が壊れることがわかった。ので、修正する
例:purchaseHistAmendRegister.html 購入履歴情報管理・購入履歴情報変更・購入履歴明細情報一覧登録
修正内容:
修正前:
<td align="center" nowrap rowspan="2">
<th:block th:if="${mode == 'ins'} " >
<a th:href="'JavaScript:document.frm.num.value =\'' + ${status.count} + '\';do_Submit_Clk2(\'insListJoin_del\');'">
<img src="/img/btn/btn_delete.gif" alt="削除" width="38" height="20" border="0"></a>
</th:block>
<th:block th:if="${mode != 'ins'} " >
<a th:href="'JavaScript:document.frm.num.value =\'' + ${status.count} + '\';do_Submit_Clk2(\'updListJoin_del\');'">
<img src="/img/btn/btn_delete.gif" alt="削除" width="38" height="20" border="0"></a>
</th:block>
</td>
</th:block>
</tr>
<tr>
<td th:class="${#fields.hasErrors('purchaseDetailHistJoinCFormList[__${status.index}__].unitPrice')} ? 'error' : 'none'">
<input th:field="*{purchaseDetailHistJoinCFormList[__${status.index}__].unitPrice}" class="form-eng" type="text" size="30" maxlength="20" />
<div th:if="${#fields.hasErrors('purchaseDetailHistJoinCFormList[__${status.index}__].unitPrice')}" th:errors="*{purchaseDetailHistJoinCFormList[__${status.index}__].unitPrice}" th:errorclass="font-s-red-form"></div>
</td>
<td th:class="${#fields.hasErrors('purchaseDetailHistJoinCFormList[__${status.index}__].quantity')} ? 'error' : 'none'">
<input th:field="*{purchaseDetailHistJoinCFormList[__${status.index}__].quantity}" class="form-eng" type="text" size="30" maxlength="20" />
<div th:if="${#fields.hasErrors('purchaseDetailHistJoinCFormList[__${status.index}__].quantity')}" th:errors="*{purchaseDetailHistJoinCFormList[__${status.index}__].quantity}" th:errorclass="font-s-red-form"></div>
</td>
<td th:class="${#fields.hasErrors('purchaseDetailHistJoinCFormList[__${status.index}__].price')} ? 'error' : 'none'">
<input th:field="*{purchaseDetailHistJoinCFormList[__${status.index}__].price}" class="form-eng" type="text" size="30" maxlength="20" />
<div th:if="${#fields.hasErrors('purchaseDetailHistJoinCFormList[__${status.index}__].price')}" th:errors="*{purchaseDetailHistJoinCFormList[__${status.index}__].price}" th:errorclass="font-s-red-form"></div>
</td>
</tr>
</th:block>
修正後:
<td align="center" nowrap rowspan="2">
<th:block th:if="${mode == 'ins'} " >
<a th:href="'JavaScript:document.frm.num.value =\'' + ${status.count} + '\';do_Submit_Clk2(\'insListJoin_del\');'">
<img src="/img/btn/btn_delete.gif" alt="削除" width="38" height="20" border="0"></a>
</th:block>
<th:block th:if="${mode != 'ins'} " >
<a th:href="'JavaScript:document.frm.num.value =\'' + ${status.count} + '\';do_Submit_Clk2(\'updListJoin_del\');'">
<img src="/img/btn/btn_delete.gif" alt="削除" width="38" height="20" border="0"></a>
</th:block>
</td>
</th:block>
</tr>
<<追加 start>>
<th:block th:if="*{purchaseDetailHistJoinCFormList[__${status.index}__].delKbn == ''}">
<<追加 end>>
<tr>
<td th:class="${#fields.hasErrors('purchaseDetailHistJoinCFormList[__${status.index}__].unitPrice')} ? 'error' : 'none'">
<input th:field="*{purchaseDetailHistJoinCFormList[__${status.index}__].unitPrice}" class="form-eng" type="text" size="30" maxlength="20" />
<div th:if="${#fields.hasErrors('purchaseDetailHistJoinCFormList[__${status.index}__].unitPrice')}" th:errors="*{purchaseDetailHistJoinCFormList[__${status.index}__].unitPrice}" th:errorclass="font-s-red-form"></div>
</td>
<td th:class="${#fields.hasErrors('purchaseDetailHistJoinCFormList[__${status.index}__].quantity')} ? 'error' : 'none'">
<input th:field="*{purchaseDetailHistJoinCFormList[__${status.index}__].quantity}" class="form-eng" type="text" size="30" maxlength="20" />
<div th:if="${#fields.hasErrors('purchaseDetailHistJoinCFormList[__${status.index}__].quantity')}" th:errors="*{purchaseDetailHistJoinCFormList[__${status.index}__].quantity}" th:errorclass="font-s-red-form"></div>
</td>
<td th:class="${#fields.hasErrors('purchaseDetailHistJoinCFormList[__${status.index}__].price')} ? 'error' : 'none'">
<input th:field="*{purchaseDetailHistJoinCFormList[__${status.index}__].price}" class="form-eng" type="text" size="30" maxlength="20" />
<div th:if="${#fields.hasErrors('purchaseDetailHistJoinCFormList[__${status.index}__].price')}" th:errors="*{purchaseDetailHistJoinCFormList[__${status.index}__].price}" th:errorclass="font-s-red-form"></div>
</td>
</tr>
<<追加 start>>
</th:block>
<<追加 end>>
</th:block>
■セッションBeanの使い方が間違っていた。ので、修正する。
検索画面Form(例:biztypeSrchForm)Bean、検索ソート順Form(例:srchOrderForm)Beanを
「@Scope(value= "session", proxyMode = ScopedProxyMode.TARGET_CLASS)」としてセッションスコープにしたが、
コントローラ(例:BiztypeController)で
画面入力した値(例:BiztypeSrchForm biztypeSrchForm,SrchOrderForm srchOrderForm,)を直接設定
(例:this.biztypeSrchForm = biztypeSrchForm;と、this.srchOrderForm = srchOrderForm;)しているので
セッションBeanでなくなっている。正しくは、セッションBeanの中身を書き換える。(変数自体を直接書き換えないこと)
・「作成例\作成先フォルダ\demo-spring-kaz01u_元ネタ削除後_最新」内容変更
・src\main\java\com\kaz01u\demo\form」内容変更
SessionUserSrchForm.java ←新規追加
SessionUserSrchOrderForm.java ←新規追加
SrchOrderForm.java ←@Scope(value= "session", proxyMode = ScopedProxyMode.TARGET_CLASS)」を削除した修正
UserSrchForm.java ←@Scope(value= "session", proxyMode = ScopedProxyMode.TARGET_CLASS)」を削除した修正
・src\main\java\com\kaz01u\demo\controller\admin」内容変更
UserController.java ←SessionUserSrchForm、SessionUserSrchOrderFormに対応した修正
・「作成例\hinagata\java\form」内容変更
03_00_SessionTblSrchForm.txt ←新規追加。Session■{Prg_name}■SrchForm向け
03_00_SessionTblSrchOrderForm.txt ←新規追加。Session■{Prg_name}■SrchOrderForm向け
03_00_TblSrchForm.txt ←@Scope(value= "session", proxyMode = ScopedProxyMode.TARGET_CLASS)」削除
・「作成例\hinagata\java\controller」内容変更
02_00_TblController.txt ←Session■{Prg_name}■SrchForm、Session■{Prg_name}■SrchOrderFormに対応した修正
02_00_TblJoinParentController.txt ←Session■{Prg_name}■SrchForm、Session■{Prg_name}■SrchOrderFormに対応した修正
02_30_01_whereItm部品.txt ←Session■{Prg_name}■SrchFormに対応した修正
02_30_02_whereEditDateFromTo部品.txt ←Session■{Prg_name}■SrchFormに対応した修正
02_30_03_whereFromToItm部品.txt ←Session■{Prg_name}■SrchFormに対応した修正
02_30_04_whereItm検索チェックボックス部品.txt ←Session■{Prg_name}■SrchFormに対応した修正
・自動作成マクロも、Session■{Prg_name}■SrchForm、Session■{Prg_name}■SrchOrderFormに対応した修正。
・自動作成後のPGMでの、セッションBean例:
1.BiztypeSrchForm 修正
@Component
<<削除 start>>
@Scope(value= "session", proxyMode = ScopedProxyMode.TARGET_CLASS)
<<削除 end>>
public class BiztypeSrchForm implements Serializable {
2.SessionBiztypeSrchForm 新規作成
<<追加>>
@Component
@Scope(value= "session", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class SessionBiztypeSrchForm implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
private BiztypeSrchForm biztypeSrchForm;
}
3.BiztypeController 修正
・・・
<<修正前>>
@Autowired
BiztypeSrchForm biztypeSrchForm; ←「@Scope(value= "session", proxyMode = ScopedProxyMode.TARGET_CLASS)」なのでセッションBean
@Autowired
SrchOrderForm srchOrderForm; ←「@Scope(value= "session", proxyMode = ScopedProxyMode.TARGET_CLASS)」なのでセッションBean
・・・
@PostMapping(params="mode=list")
public String biztypeList(BiztypeSrchForm biztypeSrchForm,
SrchOrderForm srchOrderForm,
・・・
Pageable pageable) {
//セッションに載せる
this.biztypeSrchForm = biztypeSrchForm; ←NG:変数自体を直接書き換えている。(this.biztypeSrchFormが、セッションBeanでなくなっている)
this.srchOrderForm = srchOrderForm; ←NG:変数自体を直接書き換えている。(this.srchOrderFormが、セッションBeanでなくなっている)
<<修正後>>
@Autowired
SessionBiztypeSrchForm sessionBiztypeSrchForm; ←新たにSessionBiztypeSrchFormを作って、セッションBeanとする、中身をBiztypeSrchFormとする。
@Autowired
SessionSrchOrderForm sessionSrchOrderForm; ←新たにSessionSrchOrderFormを作って、セッションBeanとする、中身をSrchOrderFormとする。
・・・
@PostMapping(params="mode=list")
public String biztypeList(BiztypeSrchForm biztypeSrchForm,
SrchOrderForm srchOrderForm,
・・・
Pageable pageable) {
//セッションに載せる
this.sessionBiztypeSrchForm.setBiztypeSrchForm(biztypeSrchForm); ←新たなSessionBiztypeSrchFormの中身BiztypeSrchFormを書き換る。
this.sessionSrchOrderForm.setSrchOrderForm(srchOrderForm); ←新たなSessionBiztypeSrchFormの中身BiztypeSrchFormを書き換る。
■Functions.javaで例外が発生しても、エラー表示画面にならないのを修正した。
理由:Functions.javaで、「throw new RuntimeException("・・・・");」とするところを
throwを書かずに「new RuntimeException("・・・・");」と書いていたので、次ステップが実行されていた。
修正:throwを追記した。
■Functions.javaのsetAndDelUploadFileメソッドの以下を修正した。
1.ファイル作成のフラッシュ、クローズを追記した。
//ファイルUPLOAD
try (OutputStream os = Files.newOutputStream(uploadfile, StandardOpenOption.CREATE)) {
byte[] bytes = file.getBytes();
os.write(bytes);
<<追加 start>>
os.flush();
os.close();
<<追加 end>>
} catch (IOException ex) {
2.javaのmatchesメソッドに対するパラメータが間違っていた
<<修正前>>
if (!table.matches("/^[0-9a-zA-Z_\\-]+$/") ||
!pkey.matches("/^[0-9a-zA-Z_\\-]+$/")) { // TABLE名キーであること。
<<修正後>>
if (!table.matches("^[0-9a-zA-Z_\\-]+$") ||
!pkey.matches("^[0-9a-zA-Z_\\-]+$")) { // TABLE名キーであること。
■画像アップロード先及びファイルアップロード先「upload」フォルダの作成が抜けていた。
1.「demo-spring-kaz01u_元ネタ削除後_最新」フォルダに「upload」フォルダを新規作成した。
さらに「javaSpringBootプログラム作成マクロ.xlsm」・「ReadMe」シートの「手順09」の以下を修正した。
<<修正前>>
手順09.STS4(Spring Tool Suite 4)に設定
3.「C:\sts\workspace\demo-spring-kaz01u」の、「src」、「sql」、「logs」フォルダを削除したのち、
「作成先フォルダ\demo-spring-kaz01u」フォルダの中身(「pom.xml」、「src]、『sql」、「logs」)をコピーしてください。
<<修正後>>
手順09.STS4(Spring Tool Suite 4)に設定
3.「C:\sts\workspace\demo-spring-kaz01u」の、「src」、「sql」、「logs」、「upload」フォルダを削除したのち、
「kaz_javaSpringBootプログラム作成ツール\作成例\作成先フォルダ\demo-spring-kaz01u」フォルダの中身
(「pom.xml」、「src]、『sql」、「logs」、「upload」)をコピーしてください。
さらに「ReadMe補足 自動作成したPGMサンプルを動かすときは」シートの「手順09」を修正した。
2.自動作成後のFunctions.java・setAndDelUploadFileメソッドの「Files.createDirectory(path);」を
「Files.createDirectories(path);」に変えた。これで、存在しないフォルダも作ってくれる。
■DbElementのチェックロジックのひな形と、自動作成マクロを修正した。
理由
例:項目名を"item31"として、コード値に”11.selectなど.大分類.ary_lrgmidsml_biztype”としたとき
「if (!dbElementsService.isCheckItem31(・・・」になってしまったので、「if (!dbElementsService.isCheckBiztypeCd(・・・」にする。
・チェックロジックのひな形修正
<<修正前>>
hinagata\java\controller\02_17_02_01_isCheckLrg部品.txt(2,8) [SJIS]: if (!dbElementsService.isCheck■{LrgKeyId}■(■{prg_name}■Form.get■{LrgKeyId}■(), false)) {
hinagata\java\controller\02_17_02_01_JoinC_isCheckLrg部品.txt(2,8) [SJIS]: if (!dbElementsService.isCheck■{LrgKeyId}■(■{prg_name}■JoinCForm.get■{LrgKeyId}■(), false)) {
hinagata\java\controller\02_17_02_02_isCheckLrgMid部品.txt(2,8) [SJIS]: if (!dbElementsService.isCheck■{MidKeyId}■(■{prg_name}■Form.get■{LrgKeyId}■(),
hinagata\java\controller\02_17_02_02_JoinC_isCheckLrgMid部品.txt(2,8) [SJIS]: if (!dbElementsService.isCheck■{MidKeyId}■(■{prg_name}■JoinCForm.get■{LrgKeyId}■(),
hinagata\java\controller\02_17_02_03_isCheckLrgMidSml部品.txt(2,8) [SJIS]: if (!dbElementsService.isCheck■{SmlKeyId}■(■{prg_name}■Form.get■{LrgKeyId}■(),
hinagata\java\controller\02_17_02_03_JoinC_isCheckLrgMidSml部品.txt(2,8) [SJIS]: if (!dbElementsService.isCheck■{SmlKeyId}■(■{prg_name}■JoinCForm.get■{LrgKeyId}■(),
hinagata\java\controller\02_26_02_01_isCheckLrg部品.txt(2,8) [SJIS]: if (!dbElementsService.isCheck■{LrgKeyId}■(■{prg_name}■SrchForm.get■{LrgKeyId}■(), true)) {
hinagata\java\controller\02_26_02_02_isCheckLrgMid部品.txt(2,8) [SJIS]: if (!dbElementsService.isCheck■{MidKeyId}■(■{prg_name}■SrchForm.get■{LrgKeyId}■(),
hinagata\java\controller\02_26_02_03_isCheckLrgMidSml部品.txt(2,8) [SJIS]: if (!dbElementsService.isCheck■{SmlKeyId}■(■{prg_name}■SrchForm.get■{LrgKeyId}■(),
hinagata\java\service\impl\02_05_02_01_isCheckLrg部品.txt(2,9) [SJIS]: if (!dbElementsService.isCheck■{LrgKeyId}■(■{prg_name}■Upload.get■{LrgKeyId}■(), false)) {
hinagata\java\service\impl\02_05_02_02_isCheckLrgMid部品.txt(2,9) [SJIS]: if (!dbElementsService.isCheck■{MidKeyId}■(■{prg_name}■Upload.get■{LrgKeyId}■(), ■{prg_name}■Upload.get■{MidKeyId}■(), false, ■{lrgKeyId}■Flg)) {
hinagata\java\service\impl\02_05_02_03_isCheckLrgMidSml部品.txt(2,9) [SJIS]: if (!dbElementsService.isCheck■{SmlKeyId}■(■{prg_name}■Upload.get■{LrgKeyId}■(), ■{prg_name}■Upload.get■{MidKeyId}■(),
<<修正後>>
hinagata\java\controller\02_17_02_01_isCheckLrg部品.txt(2,8) [SJIS]: if (!dbElementsService.isCheck■{DBLrgKeyId}■(・・・同じ・・・
hinagata\java\controller\02_17_02_01_JoinC_isCheckLrg部品.txt(2,8) [SJIS]: if (!dbElementsService.isCheck■{DBLrgKeyId}■(・・・同じ・・・
hinagata\java\controller\02_17_02_02_isCheckLrgMid部品.txt(2,8) [SJIS]: if (!dbElementsService.isCheck■{DBMidKeyId}■(・・・同じ・・・
hinagata\java\controller\02_17_02_02_JoinC_isCheckLrgMid部品.txt(2,8) [SJIS]: if (!dbElementsService.isCheck■{DBMidKeyId}■(・・・同じ・・・
hinagata\java\controller\02_17_02_03_isCheckLrgMidSml部品.txt(2,8) [SJIS]: if (!dbElementsService.isCheck■{DBSmlKeyId}■(・・・同じ・・・
hinagata\java\controller\02_17_02_03_JoinC_isCheckLrgMidSml部品.txt(2,8) [SJIS]: if (!dbElementsService.isCheck■{DBSmlKeyId}■(・・・同じ・・・
hinagata\java\controller\02_26_02_01_isCheckLrg部品.txt(2,8) [SJIS]: if (!dbElementsService.isCheck■{DBLrgKeyId}■(・・・同じ・・・
hinagata\java\controller\02_26_02_02_isCheckLrgMid部品.txt(2,8) [SJIS]: if (!dbElementsService.isCheck■{DBMidKeyId}■(・・・同じ・・・
hinagata\java\controller\02_26_02_03_isCheckLrgMidSml部品.txt(2,8) [SJIS]: if (!dbElementsService.isCheck■{DBSmlKeyId}■(・・・同じ・・・
hinagata\java\service\impl\02_05_02_01_isCheckLrg部品.txt(2,9) [SJIS]: if (!dbElementsService.isCheck■{DBLrgKeyId}■(・・・同じ・・・
hinagata\java\service\impl\02_05_02_02_isCheckLrgMid部品.txt(2,9) [SJIS]: if (!dbElementsService.isCheck■{DBMidKeyId}■(・・・同じ・・・
hinagata\java\service\impl\02_05_02_03_isCheckLrgMidSml部品.txt(2,9) [SJIS]: if (!dbElementsService.isCheck■{DBSmlKeyId}■(・・・同じ・・・
・自動作成マクロ修正
ひな型修正に合わせて、値を入れるロジック追加した。
6.よりよくするための修正
■SeqServiceImpl.javaのgetDbSeqメソッドの以下を修正した。
1.getDbSeq(String tableId, int keyItemLen, String aAri, int yymmddLen, int count)メソッド
・シーケンス番号を取得するのは別トランザクション( Propagation.REQUIRES_NEW)にする。
こうしないと、ほかの人が同じテーブルに挿入するときのシーケンス番号取得を
自分がDB登録トランザクション済みになるまで待たせることになります。
別トランザクション( Propagation.REQUIRES_NEW)にすれば、
自分のシーケンス番号取得が済めば、ほかの人がシーケンス番号を取得できるようになる。
補足:複数データの一括登録時に、ほかの人のDB追加を待たせないための工夫です。
追記:@Transactionalデフォルトは「propagation Propagation.REQUIRED」なので、
@Transactionalのメソッドから、@Transactionalのメソッドを呼び出した場合、
同一トランザクションとして処理されます。
<<追加 start>>
import org.springframework.transaction.annotation.Propagation;
<<追加 end>>
・・・
<<修正前 start>>
@Transactional(rollbackFor=Throwable.class)
<<修正前 end>>
<<修正後 start>>
@Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor=Throwable.class)
<<修正後 end>>
@Override
public String getDbSeq(String tableId, int keyItemLen, String aAri, int yymmddLen, int count) {
■2021/06/21から、『kaz_javaSpringBootプログラム自動作成◎自動生成ツール』をVectorに載せています。2022年にZenn本も書きました。使ってみての感想や間違いの指定や、こうやったほうがいいとかの情報があればメールください。
・Vector
www.vector.co.jp
・Zenn本(SpringBoot、Thymeleaf プログラム自動作成(マクロ使用版))
zenn.dev