2010年11月10日水曜日

JPAでDatabase View?

かつて、「どうしてもDatabase ViewをJPAで使いたくて、試行錯誤した」ときの記憶を思い起こす機会が最近あったので、メモメモメモメモ。


  • Entityはgenerate-entities等で作成しても意味不明なごみがくっついてくるので、手で作成した方が早いということで、Database Viewのエンティティは手作成の運用をしていたと記憶が
  • 当り前なのですが、DAOで更新系の実装をすると怒られます。
  • persistence.xmlで<property name="hibernate.hbm2ddl.auto" value="none"/>が必須になります。(create-dropとかにすると、その名前のテーブルを作成しに行って、同一名称のViewが存在している旨のエラーがデプロイ毎に吐き出されます。)
  • 作成するEntityはそのViewがテーブルだと思って作成して差し支えないのですが、Viewとほかのエンティティでさらに@OneToManyとかやりだすと苦しいと思います。
  • 当時の用途はリスト表示個所だったのですが、リストから詳細ページに入る際に詳細ページ側でテーブルのエンティティを再取得することになるかと思います。このことがStateful Session Bean/対話との相性が微妙になる気もしますので、留意が必要かもしれません。当時は、対話を詳細ページにGETパラメータでキーを渡して、詳細ページから対話を開始するようにしていました。(多分)
  • まぁ、そういう意味で現時点では色々とアレなので、fetch=FetchType.EAGER等でテーブルだけのORMで代用できないか検討した方が良いかと思います。簡単な深くない結合であれば十分代用可能と思います。


あくまでも、僕はこう逃げたというお話なので、重々注意をしてください。


※参考
http://www.adam-bien.com/roller/abien/entry/mapping_jpa_entities_on_view
なんか見れないのでGoogleキャッシュも
http://webcache.googleusercontent.com/search?q=cache:VUnfCPteIlIJ:www.adam-bien.com/roller/abien/entry/mapping_jpa_entities_on_view+jpa+database+view&cd=2&hl=ja&ct=clnk&gl=jp