2013年11月23日土曜日

org.hibernate.NonUniqueObjectExceptionにもちょっとハマった

Hibernateで以下の例外が出る場合は、リレーションシップにあるエンティティ(クラス)のhashCode、equalsメソッドがどう実装されているか見直しましょう。

Caused by: org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session:

jQueryの:notセレクタは何かと便利

HTMLのエレメントでclassに何種類か設定してある場合、jQueryの:notセレクタを使ってやると便利。

<div class="someA someB" />

<script>
  var divs = $('.someA:not(someB)');
</script>

みたいな感じ。

MySQLの作成日と更新日のカラム生成の設定が分かりやすかった記事

MySQLのテーブルでレコードの増減が頻繁に起こるテーブルは作成日と更新日のカラムを作成したりすると便利です。ただ、コードでいちいち書くの面倒くさいからデータベース側で設定できないか調べていると便利な記事を見つけました。

ポイントは、

  • Timestamp型はレコードに更新があれば自動更新してくれる。ただし、テーブルにつき1つ。
  • 作成日カラムはDatetime型にする。
  • レコードがINSERTされたら作成日を設定してやるトリガーを用意。
こんなとこでした。あとの注意点は作成日のデフォルト値かな。


http://www.marcus-povey.co.uk/2013/03/11/automatic-create-and-modified-timestamps-in-mysql/

HibernateのAutomatic State Detection

まだちょっとsaveOrUpdateとmergeの違いを分かっていないのですが、基本的なところでsaveする時とupdateする時の違いは、エンティティのID(主キー)がnullかどうかで自動制御しているようです。ちょっと、ここもハマった。

// in the first session
Cat cat = (Cat) firstSession.load(Cat.class, catID);

// in a higher tier of the application
Cat mate = new Cat();
cat.setMate(mate);

// later, in a new session
secondSession.saveOrUpdate(cat);   // update existing state (cat has a non-null id)
secondSession.saveOrUpdate(mate);  // save the new instance (mate has a null id)


http://docs.jboss.org/hibernate/core/3.3/reference/en/html/objectstate.html#objectstate-saveorupdate

HTMLのhiddenを使わずして値をエレメントに保持する

HTMLのページで、例えばテーブルの列のIDなどを保持したい場合にhiddenなどのタグを使うと面倒くさいので、エレメントその物にデータ(ID)を保持できるのが便利。

DIVのdata-value属性を使ってやると、jQueryだとdata()で取得できる。


<div class="comment" data-value="64">

 var value = $('[div selector]').data('value');

楽ちん楽ちん。

jQueryでAjaxを使ったDataTableでちょっとハマったとこ

jQueryのDatableのプラグインで、Ajaxを使ってサーバーサイドからデータを取るページを作るのに若干ハマったとこをメモ書き。

ページでテーブルが表示されてから、何かのアクションを起こしてテーブルをサーバーサイドのデータで再描画する時、sEchoというパラメータに注意。あまり注意してなかったので、適当に1と設定していたのですが、これは描画リクエストがある度に更新してやらないと、クライアントサイドで再描画が起こらない。(キャッシュしてるのかな?)

という事なので、バックエンドではインクリメントをして返してやると、ちゃんとテーブルを描画してくれました。

stringsEchoAn unaltered copy of sEcho sent from the client side. This parameter will change with each draw (it is basically a draw count) - so it is important that this is implemented. Note that it strongly recommended for security reasons that you 'cast' this parameter to an integer in order to prevent Cross Site Scripting (XSS) attacks.

2013年11月21日木曜日

JPAとHibernateのCascadeTypeにハマりました。。。


Hibernateでエンティティの関連性にCascadeTypeを使うと、データ取得だけとか、更新もするとか、いろいろ指定できるはずなのですが、できない??結構ハマったのですが、いろいろと調べると参考になるサイトに、JPAとHibernateでそれぞれCascadeTypeのアノテーションがあり、HibernateのSessionを使っているとJPAのCascadeTypeでは予測した挙動で動いてくれないようです。これはハマる!!

org.hibernate.annotations.CascadeType
javax.persistence.CascadeType
は違う!!

JPA
 @OneToMany(fetch = FetchType.LAZY, 
       cascade = {CascadeType.PERSIST,CascadeType.MERGE }, 
       mappedBy = "stock")
Hibernate
@OneToMany(fetch = FetchType.LAZY, mappedBy = "stock")
@Cascade({CascadeType.SAVE_UPDATE})

それにしても、@OneToManyはjavax.persistenceで、@Cascadeはorg.hibernate.annotations、ややこしい。。。

http://docs.jboss.org/hibernate/core/3.5/javadocs/org/hibernate/annotations/CascadeType.html
http://docs.oracle.com/javaee/6/api/javax/persistence/CascadeType.html