Hibernateで以下の例外が出る場合は、リレーションシップにあるエンティティ(クラス)のhashCode、equalsメソッドがどう実装されているか見直しましょう。
Caused by: org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session:
2013年11月23日土曜日
jQueryの:notセレクタは何かと便利
HTMLのエレメントでclassに何種類か設定してある場合、jQueryの:notセレクタを使ってやると便利。
<div class="someA someB" />
<script>
var divs = $('.someA:not(someB)');
</script>
みたいな感じ。
<div class="someA someB" />
<script>
var divs = $('.someA:not(someB)');
</script>
みたいな感じ。
MySQLの作成日と更新日のカラム生成の設定が分かりやすかった記事
MySQLのテーブルでレコードの増減が頻繁に起こるテーブルは作成日と更新日のカラムを作成したりすると便利です。ただ、コードでいちいち書くの面倒くさいからデータベース側で設定できないか調べていると便利な記事を見つけました。
ポイントは、
http://www.marcus-povey.co.uk/2013/03/11/automatic-create-and-modified-timestamps-in-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かどうかで自動制御しているようです。ちょっと、ここもハマった。
http://docs.jboss.org/hibernate/core/3.3/reference/en/html/objectstate.html#objectstate-saveorupdate
// 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と設定していたのですが、これは描画リクエストがある度に更新してやらないと、クライアントサイドで再描画が起こらない。(キャッシュしてるのかな?)
という事なので、バックエンドではインクリメントをして返してやると、ちゃんとテーブルを描画してくれました。
| string | sEcho | An 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. |
ラベル:
AJAX,
DataTables,
jQuery
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.oracle.com/javaee/6/api/javax/persistence/CascadeType.html
登録:
投稿 (Atom)