読者です 読者をやめる 読者になる 読者になる

この日記は私的なものであり所属会社の見解とは無関係です。 GitHub: takahashikzn

テーブルにカラムがない場合に、エンティティの属性を無かったことにする

とあるシステムにおいて、「エンティティの属性について、テーブルにカラムがある場合のみマッピングを行う」必要が出てきました。 要するに、 @Entity public class Sample { @Column private int foo; // テーブルにbarカラムがない場合は何もしない @Colu…

EclipseLinkがDBを自動判定する仕組み

EclipseLinkは、DBに応じた固有のSQLを生成することでパフォーマンスを稼ぐ機能を持っています (eclipselink.jdbc.native-sql)。 そして、設定ファイルに何も書かなくてもDB製品は自動判定されているのですが、そのあたりの処理は org.eclipse.persistence.i…

eclipselink-2.5.0リリース

eclipselink-2.5.0がリリースされました。 http://www.eclipse.org/eclipselink/releases/2.5.php 今回の目玉は以下の通り。 Full JPA 2.1 support Maven Central support New DB platforms: HANA and Pervasive JPA-RS Enhancements MOXy - NamedObjectGrap…

eclipselink-2.4.1でキャッシュの振る舞いが変わった?

EclipseLink-2.4.0からEclipseLink-2.4.1へ更新したら不具合が発生しました。 具体的には、前のトランザクションでSelectしたエンティティのリストがキャッシュされているようで、 同じIDで取得できるエンティティの属性値が、DBの状態に関わらず同じままの…

java.lang.Errorにキャストできない?

JPAのエンティティリスナー実行時にこんなエラーが出ました。 java.lang.Errorにキャストできない?何だそりゃ? java.lang.ClassCastException: jp.root42.r42fw.service.ServiceException cannot be cast to java.lang.Error at org.eclipse.persistence.i…

EclipseLinkの最適化オプション

昔、EclipseLinkのLazyLoadingを使うには EclipseLinkのとある最適化オプションをOFFにしなければならないという不具合があったのですが、 今なんとなく調べてみたところ、この不具合はEclipseLink-2.2.0では解消されているようです。 ただし、このオプショ…

MySQLのPacketTooBigException

MySQLへデカいファイルを送るときは、my.cnf(またはmy.ini)で max_allowed_packet=10Mのように設定する。みんな知ってるね。 しかし。。。 では10Mまでのパケットを送れるように設定したのだから、 9.5Mのファイルを転送しても当然OKだろ常識的に考えて。 と…

続・@ManyToManyでConcurrentModificationExceptionが出る件

昔悩んでいたこのエラー。やっと原因がわかりました。 例えば以下のようなエンティティがあったとします。 @Entity public class Shop { @ManyToMany // fetchを指定しない場合、デフォルトはLAZYであることに注意 private Set<Product> products; ... } @Entity publ</product>…

エンティティオブジェクトはObject#hashCodeを実装してはいけない

...って言うのは少々大げさなのですが、普段は何気ないメソッドも、 油断をすると牙を向いてきますよ、というお話。 親子関係にある2つのエンティティが1:Nの関係で存在したとき、 親エンティティをSetに詰めるコードがあったのですが、 なぜか親エンティテ…

EclipseLink-2.0.0とLazy Loading

昔の日記で、EclipseLinkとSpringを使ったLazy Loadingの設定方法を紹介しました。 本日、EclipseLink-2.0.0がさりげなくリリースされているのを発見。早速乗り換えてみたところ… java.lang.ClassCastException: java.lang.Integer cannot be cast to java.l…

Lazy Loadingしていると、エンティティのequalsメソッドがおかしくなる(かも)

EclipseLinkを使ってLazy Loading設定しているとき、 エンティティのequalsメソッドの扱いが面倒になることが判りました。 例えば次のようなケースを考えてみます。 1つの店舗(Shop)は、一人の従業員(Employee)を店長として持っているという関係です。この図…

Lazy Loadingを設定していると、Webアプリがときどき起動失敗する件

EclipseLinkでLazy Loadingを設定していると、ときどき盛大にエラーを吐いてTomcatが起動失敗することがあります。 Exception [EclipseLink-0] (Eclipse Persistence Services - 1.1.2.v20090612-r4475): org.eclipse.persistence.exceptions.IntegrityExcep…

@Lobなフィールドを遅延ロードできない件

次のようにして、@LobなフィールドをLazy loadingとして指示してもダメでした。 @Entity public class ImageData { @Id private long id; @Column @Lob @Basic(fetch = FetchType.LAZY) private byte[] data; @Column private String name; ... } このように…

@ManyToManyと@JoinTableを使ってuni-directionalにFetch Joinする

『店舗』と『商品』の間にN:Nの関係があったとします。 スキーマは次のような感じ。 -- 店舗 create table Shop ( id bigint primary key, ... ); -- 商品 create table Product ( id bigint primary key, ... ); -- 店舗がどの商品を扱うかの関連を表す (As…

EclipseLinkとSpring2.5でLazy Loading

拙作R42FWではEclipseLinkとSpring2.5を組み合わせて使用していますが、 この組み合わせで、JPAのLazy Loadingが動作させることができたので、その手順を紹介します。 EclipseLink単品で使用する場合の手順では動かない まず最初にこちらに書いてある手順で…

『OracleのIN句の引数は1000個まで』問題

Oracleには、IN句の引数が1000個までという制限(※)があります。(※) Oracleのアーキテクチャ上、IN句の最適化が難しいためにわざと設けた制限であると、どこかで読んだ気が。 JPQLにもIN句があるので、 『OracleでJPAを使用した場合は同様の制限があるのかも…

EclipseLinkで悲観ロック

次のようにします。 import org.eclipse.persistence.config.*; public class JPADialect { ... public void setPessimisticLock(final Query query, final boolean nowait) { if (nowait) { query.setHint(QueryHints.PESSIMISTIC_LOCK, PessimisticLock.Lo…

EclipseLink固有APIを使って、DELETE文を優先させる

ひとつ前のエントリでも説明したのですが、JPAのデフォルトではDMLの実行はコミット時に行われます。 それはJPA仕様ということで理解できるのですが、 タチの悪いことに、DML文の実行順序はEntityManagerの更新系メソッドの呼び出し順序と一致しないことがあ…

Query#getResultListでConcurrentModificationException?

EclipseLink(1.1.2)が良く分からないエラーを吐く。何でConcurrentModificationExceptionになるんだろう。 java.util.ConcurrentModificationException java.util.IdentityHashMap$IdentityHashMapIterator.nextIndex(IdentityHashMap.java:715) java.util.I…