オラクルマスタブロンズ学習用サイト
オラクルの出していたWeb雑誌に、基礎から始めるデータベース入門セミナーを発見。
リンクが切れている状態なのでここで一覧にする。
http://www.oracle.com/technology/global/jp/pub/jp/articles/2shin/1/index.html
http://www.oracle.co.jp/2shin/ora74/18_19.html
http://www.oracle.co.jp/2shin/ora75/16_17.html
http://www.oracle.co.jp/2shin/ora76/18_19.html
http://www.oracle.co.jp/2shin/ora77/20_21.html
http://www.oracle.co.jp/2shin/ora78/18_19.html
http://www.oracle.co.jp/2shin/ora79/12_13.html
http://www.oracle.co.jp/2shin/ora80/16_17.html
http://www.oracle.co.jp/2shin/ora81/14_15.html
http://www.oracle.co.jp/2shin/ora82/14_15.html
http://www.oracle.co.jp/2shin/ora83/18_19.html
此処から先は不明・・・・・・・・・・・・
S2Dao N対1マッピングのやり方
DEPテーブル(1側)とUSERテーブル(N側)があって、
DEPNOに紐づくUSERIDを取ってきなさい、というのは普通の話。※1
複数のUSERIDが取れます。
今回はそれに加えて、ちょっと特殊な
「DEPテーブルをN側に見る」やり方を調査する必要があったのでメモ。※2
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
【テーブル】
★USERTABLE
★DEPTABLE
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
【Todo】
select * from test_usertable u , test_deptable d
where u.depbango = d.depno and u.userid='0001'
を発行する。
結果はこうなりますね。DEP側がNの関係になっています。
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
【やり方】
ポイントは「1側のDTOをN側のカラムフィールドと共に定義する」です。
※1の場合だと、N側はUSERですので、DTOはこうなります。
なら※2の場合のN側は?
そう、DEPです。なので、USERをDTOフィールドとしてまとめて定義します。
dao.dicon デフォルト値のいじり方
<component class="org.seasar.dao.impl.ResultSetHandlerFactorySelector">
<property name="restrictNotSingleResult">true</property>
</component>
プロパティをtrueにしましょうといわれても、初心者にはむずかしい。
【参考】
http://s2dao.seasar.org/ja/daoDicon.html#ResultSetHandlerFactorySelector
Seasar2.3⇒2.4 S2Struts⇒SAStruts の移行記録
メモ。
【1】Interceptorの記述方法が違う!
S2Strutsでは、ActionImplを登録するdiconにインタセプタを記述していたのですが、
SAStrutsではcustomizer.dicon という専用のdiconがあってそこに書くようになっています。
↓
<!-- Actionのpublicメソッド実行時に適用 -->
<!-- Loginチェックを行うInterceptor -->
<!-- Loginページは該当しない -->
<initMethod name="addCustomizer">
<arg>
<component class="org.seasar.framework.container.customizer.AspectCustomizer">
<property name="interceptorName">"loginConfirmInterceptor"</property>
<initMethod name="addIgnoreClassPattern">
<arg>"jp.go.nta.hogeop.eq.action.z"</arg>
<arg>"LoginAction"</arg>
</initMethod>
</component>
</arg>
</initMethod>
Sesar2 Dao実体化を2段階に分けるdiconファイル
メモ
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE components PUBLIC "-//SEASAR2.1//DTD S2Container//EN"
"http://www.seasar.org/dtd/components21.dtd"><components namespace="dao">
<!-- デフォルトのdao.diconを転記 ここから-->
<include path="j2ee.dicon"/>
<component class="org.seasar.dao.impl.AnnotationReaderFactoryImpl"/>
<component class="org.seasar.dao.impl.DaoMetaDataFactoryImpl"/>
<component
name="interceptor"
class="org.seasar.dao.pager.PagerS2DaoInterceptorWrapper">
<arg>
<component class="org.seasar.dao.interceptors.S2DaoInterceptor"/>
</arg>
</component>
<component class="org.seasar.dao.impl.ValueTypeFactoryImpl"/>
<component name="stringClobType">
@org.seasar.dao.types.ValueTypes@CLOB
</component>
<component class="org.seasar.dao.impl.BeanMetaDataFactoryImpl"/>
<component class="org.seasar.dao.impl.DaoNamingConventionImpl"/>
<component class="org.seasar.dao.impl.NullBeanEnhancer"/>
<component class="org.seasar.dao.impl.ResultSetHandlerFactorySelector"/>
<component class="org.seasar.dao.impl.DtoMetaDataFactoryImpl"/>
<component class="org.seasar.dao.impl.PropertyTypeFactoryBuilderImpl"/>
<component class="org.seasar.dao.impl.RelationPropertyTypeFactoryBuilderImpl"/>
<component class="org.seasar.dao.impl.DefaultTableNaming"/>
<component class="org.seasar.dao.impl.DefaultColumnNaming"/>
<component class="org.seasar.dao.impl.ProcedureMetaDataFactoryImpl"/><!-- デフォルトのdao.diconを転記 ここまで-->
<component class="org.seasar.framework.container.autoregister.FileSystemComponentAutoRegister">
<property name="autoNaming">
<component class="org.seasar.framework.container.autoregister.DefaultAutoNaming"/>
</property>
<initMethod name="addClassPattern">
<arg>"hoge"</arg>
<arg>".*Dao"</arg>
</initMethod>
</component>
<!-- SqlCheckInterceptorを適用 -->
<component name="sqlCheckInterceptor" class="hoge.common.interceptor.SqlCheckInterceptor"/>
<!-- TrimInterceptorを適用 -->
<component name="trim" class="hoge.common.interceptor.TrimInterceptor"/>
<component class="org.seasar.framework.container.autoregister.AspectAutoRegister">
<property name="interceptor">dao.interceptor</property>
<initMethod name="addClassPattern">
<arg>"hoge.common.dao"</arg>
<arg>".*Dao"</arg>
</initMethod>
</component>
<!-- Dao実行時ではなくActionImpi実行時に処理するため actionimpl.dicon に移動 -->
<!-- LogTableInterceptorを適用 -->
<!-- <component name="logTableInterceptor" class="hoge.common.interceptor.LogTableInterceptor"/> -->
<!--
<component class="org.seasar.framework.container.autoregister.AspectAutoRegister">
<property name="interceptor">logTableInterceptor</property>
<initMethod name="addClassPattern">
<arg>"hoge.dao"</arg>
<arg>".*Dao"</arg>
</initMethod>
</component> -->
<component class="org.seasar.framework.container.autoregister.AspectAutoRegister">
<property name="interceptor">sqlCheckInterceptor</property>
<initMethod name="addClassPattern">
<arg>"hoge.dao"</arg>
<arg>".*Dao"</arg>
</initMethod>
</component>
<component class="org.seasar.framework.container.autoregister.AspectAutoRegister">
<property name="interceptor">dao.interceptor</property>
<initMethod name="addClassPattern">
<arg>"hoge.dao"</arg>
<arg>".*Dao"</arg>
</initMethod>
</component>
</components>