September 3, 2009
by reciente
0 comments
JPAの問題点
というブログ記事を発見。
確かに、JPAの問題点はたくさんあるよね。
でも、Spring も Hibernate もドキュメントが揃っているので、楽です。
Seasar は昔使っていたんだけれど、ドキュメントが無さ過ぎて、調べてもでてこないというのが辛かった。
MLで聞けばいいんだろうけれど、自分はそれよりも、多少扱いづらい部分があっても
ドキュメントが最初からある方を選ぶかな。
そこは人それぞれだからなんとも言えないけれどね。
まあ、これから段々使いやすくなっていくでしょう。
JavaはWebシステム構築としてこれからも使うだろうし。
パフォーマンス必要ないときは、Pythonを使うけれどね(・・
JPA
August 31, 2009
by reciente
0 comments
JPAで
@OneToOne
@JoinColumn
を使って、JOINを張ったら、そのモデルを使って INSERT文を走らせる時に、specified twice っていうエラーが出るようになった。
SQLを見てみると、確かに同じColumnを二回指定している。
http://72.5.124.55/javaee/5/docs/api/javax/persistence/JoinColumn.html
ここを見ると、
@JoinColumn(insertable = false)
というのがあるので、それを指定したら解決。
updatable
public abstract boolean updatable
(Optional) Whether the column is included in SQL UPDATE statements generated by the persistence provider.
Default:
true
ってあるように、Modelの中身を更新すると、勝手に UPDATE文が走るので、それが嫌な人は false にしておこう。
このオプションは
@Column
にもあるので、別にJOIN限定の処理ではない。
JPAはアノテーションをモデルにいくつくっつけるかの設定次第だなぁ
Djangoも結局、キーワード引数でいくつオプション付けるか。
っていう部分は当然あるし。
まあ、そうなるよなーって思う。
そう思うから、Annotation で Model いじればなんとかなるんじゃね?って思って調べるきっかけになるし。
JPAでこれだけ色々やれるってなると、本気のHIBERNATEを使ってみたくなるなぁ
どんだけ凄いんだろう。
JPA
August 28, 2009
by reciente
0 comments
最近のJavaは、LLに対応してか、LLで簡単に出来る事を、Javaも簡単に出来る様になってきている。
Javaの方が早いので、自分の仕事の場合、Javaを使う機会が多い。
という訳で、JPAでリレーションってどうやるんだろ。と調べてみたら、JPA + Oracle の記事があった。しかも、結構古いしw
JPAの試用
ん~ Djangoとかとやる事は一緒だなぁ
Model 部分で関連付け登録をしてあげて、後はお任せ!
ってやつですな。
はまるポイントが一箇所あって
JPAの規約では、外部キーは、REG_ID の様に、大文字_IDと変換されます。
CREATE TABLE category
(
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
name VARCHAR(255) UNIQUE,
PRIMARY KEY(id)
)
ENGINE=MyISAM
;
CREATE TABLE book
(
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
book_category_id INT UNSIGNED NOT NULL,
name VARCHAR(255),
PRIMARY KEY(id)
)
ENGINE=MyISAM
;
というテーブルがあった場合
@Entity
@Table(name = "book_category")
public class BookCategory {
@Id
@GeneratedValue
@OneToOne(mappedBy = "book_category")
private Integer id;
private String name;
}
@Entity
@Table(name = "book")
public class Book{
@Id
@GeneratedValue
private Integer id;
@Column(name = "book_category_id")
private Integer bookCategoryId;
@OneToOne
@JoinColumn(name = "BOOK_CATEGORY_ID")
private BookCategory bookCategory;
}
こんな感じになる。
# Getter, Setterとか、テーブル定義とかは省略。
ログを追ってみると、どうにもSQLを二回発行しているっぽい。
InnoDBで作ると違う結果かもしれないし、MyISAMの場合、二回SELECTしてもそれほど遅くないのでいいかな。
それが気になるなら、O/R Mapper使うなーって思うし。
JPAのQueryの書き方とかちょっとキモイけれど、慣れればそんなものかなーって思わなくもないかも。
まだ余り使い込んでいないので、無駄に変な取得の仕方をしている部分があるだろうけれど・・・
とりあえず、必ずListでしか取れないってのはおかしいと思うんだよね。
何か方法があるはず・・・
count取る時は、Longできちんと取れているし・・・
まあ、まだまだ慣れていないからなー
Struts2 + Spring + JPA で作業しているけれど、結構使いやすいとは思う。
struts.xml が凄い量になってきているけれど。
まあ、そんなものかなぁ・・・と思わないでもない。
パフォーマンスも気にならないので、暫くこれで様子を見てみよう。
LL使うのに比べたら、ちょっと変な処理入っていても早いからなぁ~
JPA