Joined Subclass の バルク更新

JPQLのバルク更新はポリモーフィックです。どういうことかというと、たとえば親エンティティへのDELETE操作は子エンティティへのDELETE操作でもあるのです。その結果、マッピングによってはJPQLのDELETE文がSQLでは複数のDELETE文になることがあります。

Java EE勉強会でこのことを実際に動かして示したかったのですがうまく動かなくてお見せできませんでした。でも、家に帰ってもういちど試してみるとちゃんと動きました。警告のログが出るのですが、これを例外が発生して正常に動作していないと思ってしまったようです。

次回でもいいのですが、忘れないうちにちょっと書いておきます。以下簡単なサンプルです。

続きを読む

S2Hibernateの進捗 その2

EntityReaderのコードを整理したらはHibenateのAPIを直接呼ばなくていいほどにすっきりしました(^^

EntityReaderはJoinedSubclassの継承があるときなどに親子のテーブル両方をDataSetに変換しますが、さらに@CollectionOfElementsでマッピングされたテーブルも同時にDataSetに変換しちゃおうかなと思っています(ちょっと先の予定)。あんまり需要ないかな?

次はS2Junit4を整理してEntityReaderを使えるようにします。

S2Hibernateの進捗

HibernateのエンティティをDataSetに変換するEntityReaderがようやく形になってきました。(コミットしました。)
もう少し洗練させたら S2JUnit4からこのEntityReaderを使ってエンティティとExcelを比較できるようにします。
S2JUnit4ももう少し使いやすくしないとなぁ。
その後でorg.seasar.framework.ejb.unitパッケージは削除しようと思います。

Mavenでのテスト通りました。

id:koichikさん、S2Hibernate-JPAMavenでテストが通らないというのはガセネタでした。すみません。m(_ _)m
ローカルのリポジトリ(.m2/repogitory)を一旦削除してテスト走らせたらOKでした。私の環境の問題だったようです。

S2Hiberanteでマッピングファイルの自動登録

こんな感じで考えました。
まずpersistence.xmlのproviderにorg.seasar.hibernate.jpa.S2HibernatePersistenceを指定。

persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence>
  <persistence-unit name="persistenceUnit" transaction-type="JTA">
    <jta-data-source>jdbc/DataSource</jta-data-source>
    <provider>org.seasar.hibernate.jpa.S2HibernatePersistence</provider>
    <properties>
      <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>
      <property name="hibernate.jndi.class" value="org.seasar.extension.j2ee.JndiContextFactory"/>
      <property name="hibernate.transaction.manager_lookup_class" value="org.seasar.hibernate.jpa.transaction.S2TransactionManagerLookup"/>
      <property name="hibernate.show_sql" value="false"/>
      <property name="hibernate.format_sql" value="true"/>
      <property name="hibernate.use_sql_comments" value="false"/>
    </properties>
  </persistence-unit>
</persistence>

次にdiconファイルでResourceAutoDetectorImplとS2HibernateConfigurationを設定。この例ではMETA-INF直下のxxxOrm.xmlを自動で読み込むようにしてみました。(Naming Conventions for Java Persistenceに従うとマッピングファイル名はxxxOrm.xmlとするのがいいらしいです。この規約一般的になるのかなぁ?)

hoge.dicon

<components>

  <component name="detector" class="org.seasar.framework.autodetector.impl.ResourceAutoDetectorImpl">
    <initMethod name="addReferenceClass">
      <arg>@org.seasar.hibernate.jpa.Employee@class</arg>
    </initMethod>
    <initMethod name="addResourceNamePattern">
      <arg>"META-INF/.*Orm\\.xml"</arg>
    </initMethod>
  </component>
  
  <component class="org.seasar.hibernate.jpa.S2HibernateConfiguration">
    <initMethod name="addResourceAutoDetector">
      <arg>detector</arg>
    </initMethod>
  </component>

</components>

まだまだ

マッピングファイルを自動でみつけてHibernateに渡す機能を作ったつもりでしたが、マッピングファイルのpathをHibernateに教えても正確じゃないですね...おんなじリソースを読み込むとは限らないし。InputStreamにすべきですね、きっと。明日やります。ResourceをTraverseするところも直さないと。