Java: JPA: JPA でリレーション

最近の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使うのに比べたら、ちょっと変な処理入っていても早いからなぁ~

Leave a comment

0 Comments.

Leave a Reply


[ Ctrl + Enter ]

Spam Protection by WP-SpamFree