行く記憶の流れは絶えずして

戻ってこないのでメモするところ

DropwizardにおけるHibernateでのテーブル名定義箇所

今回一番引っかかったところ。

 

Dropwizardに組み込まれているHibernateのテンプレートクラスは、

  1. 設定ファイルに接続情報を記載
  2. Pojoの定義
  3. AbstractDAOの継承
  4. HQLを@NamedQueryで宣言、呼び出し
  5. サービス登録

って感じでマッピングxmlをいちいち作成しなくて便利。

だが、テーブル名の定義が@Tableと@NamedQuery内の2箇所であり、

どっちを使ってるのかいまいち。

 

そこで実験してみました。

というより今回引っかかったのでついでにいろいろ試しただけです。

 

大文字小文字の区別をこんな感じでしてみました。

Dropwizardのバージョンは0.7.0です。

NoSQLテーブル名POJOクラス名@Table@NamedQuery結果
1 BBSDATA BBSData BBSData BBSData クエリ呼び出し時にNG
MySQLSyntaxErrorException: Table 'Schema.BBSData' doesn't exist
2 BBSDATA BBSData BBSData BBSDATA Dropwizard起動時にNG
QuerySyntaxException: BBSDATA is not mapped
3 BBSDATA BBSData BBSDATA BBSData OK
4 BBSDATA BBSData BBSDATA BBSDATA Dropwizard起動時にNG
QuerySyntaxException: BBSDATA is not mapped
5 BBSDATA BBSDATA BBSData BBSData Dropwizard起動時にNG
QuerySyntaxException: BBSData is not mapped
6 BBSDATA BBSDATA BBSData BBSDATA クエリ呼び出し時にNG
MySQLSyntaxErrorException: Table 'Schema.BBSData' doesn't exist
7 BBSDATA BBSDATA BBSDATA BBSData Dropwizard起動時にNG
QuerySyntaxException: BBSData is not mapped
8 BBSDATA BBSDATA BBSDATA BBSDATA OK

 

意外だったのがPOJOのクラス名をみている?こと。

 

考察してみる。

  • No1とNo3より、SQL問い合わせは@Tableを使用してるっぽい。
  • No2、4、5、7より、"not mapped"と叱られているのは@NamedQuery。
  • また、No2、4、5、7はPOJOクラス名≠@NamedQuery。
  • 成功しているNo3、No8POJOクラス名=@NamedQuery。

 

これらより、

@NamedQueryに出てくるPOJOクラス名を@Tableで置換しているのか?

と推測。

 

 

Dropwizard勉強中のTips②

考えてみれば当たり前なんだけど、Dropwizardはjerseyを使ってるから

調べるときもjersey(JAX-RS)で検索したほうがかかりやすい、と。

 

ただ、今使ってるのDropwizardは0.7。

0.8がすでに存在し、jerseyのバージョンが上がって結構変わるらしい。

HK2とか言う記述をチラッと見たけど、

とりあえず0.7で一通り完成させてから対応させるつもり。

 

  1. @Entityのあるpojoはスコープのどれかに@Idが必要.

    tableではなくviewにマッピングすると忘れがち。

    たまたまUniqueな値がいたからそれにしたけど、違うと何かあるのかな。

  2. @ContextでHttpSessionを扱いたい場合はHttpSession,SessionHandlerの登録が必要。

jQuery Mobile覚書(form周り)

  1. jQuery Mobileでformのpost送信したければformの属性にdata-ajax="false"を指定。

    一括指定する方法もあるらしいけど、今回はこっち。

    ( $.mobile.ajaxFormsEnabled = false をjQuery mobile.jsの読み込み前に実行:

    jQuery Mobile の Ajax を使用したページやフォーム遷移を無効にする - 暇人じゃない )

  2. 普通のformだと$.postの引数に$(form).serializeArray()を使っていたが、

    jQuery Mobileはformの構造を変えるので使えない

    <form><input></form>が<form><div><input></div></form>みたいに変化し、レイアウト用のdivが挟まる。

    その結果inputはformの直接の子ではなくなるので反応しなくなるっぽい。

MySQL覚書(foreign keyなど)

  1. foreign keyを使いたければInnoDB

    MySQL(5.1.73)でのデフォルトはMyISAMというものらしい。

    さくっと調べた結果、MyISAMのほうが機能で劣る代わりに速いと解釈しました。

  2. foreign keyで制約するテーブル(例:売り上げレコード)はInnoDBである必要が有るのは分かるけど、

    制約のために参照する側(例:店舗一覧)もInnoDBでなければならない。注意。

  3. SQLでUnsignedの整数のデータをhibernateマッピングしたい場合、

    そのデータを表現できる整数型(int(11) unsignedならlong)でOK。

徹夜

 

何年ぶりかに午前7時まで徹夜。
途中でチャージマン研の動画を流していたので頭がいい感じに煮えてしまった。

何というか、スタックの上限が減る感じ。

過程の積み重ねができなくなったり、同時に物事を進められなくなったり。

 

若いころは疲れながらも達成感があったのですが、今は後悔しかない。


とはいえ得られたものも多くありました。

 

JavaのPython化?

最近、データ処理用途にPythonも使っています。

itertoolsなどの各種Generatorが非常に面白く、種類が多くて使いこなせていませんが

どれにしようかなと悩むのが楽しかったり。

 

で、Java8も最近やっと調べ始めたのですが、ラムダ式の他にもStreamAPIを知りました。

何というか、まんまPython

ただStreamAPIは非常にまどろっこしい。Pythonみたいにもっと簡単に書けたら捗るんだけどなぁ。

なぜかPythonみたいにIteratorベースじゃないし。

あとはyieldが使えるとうれしいのですが。

 

かなり近づいてきた感がありますが、クラスの宣言の楽さやジェネリクスなどがあるから

まだJavaのほうがなじむ感じがします。

Pythonは繰り返しをスマートに書こうとすればするほど一行が伸びるので、

適度に区切るとJavaでも事足りるかな、と。

 

jqueryのloadのcallbackでハマる

loadで持ってきたDOM要素に対してコールバックのタイミングでjqueryセレクタが機能しない。

下記のalert文の時点でURLの要素が何も表示されてないことより確認。

ブラウザ依存(環境はFirefox)?他は未確認。

$("#id").load("URL",null,function(){

    alert(URLの要素)

    URLから取得した要素に対しイベント追加

});

悔しいので

  • 2行に分けて$("#id").ready(function()…にして区切ってみる
  • コールバックをsetTimeoutで明示的に遅らせてみる

とかとかいろいろ試した結果、

$.get(URL,{},

    function(data){

        dataにイベントを追加

        $("#id").html(data)

    },

    "html"

);

に落ち着きました。

load()はDOM操作のない情報に対して向いているという解釈でいいのかな。

load()は$.get()に対して記述が楽以外のメリットがないと使わないほうが紛れがないですね。

load()も結局パラメータなしのGETリクエストなので。

jqueryのパフォーマンスで上回るとかあるのかもしれない。