1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

2017年度 Java 永続化フレームワークについての考察(7) EclipseLink

Posted at

#前ポスト

#前置き
隙間時間を利用して書いているので精度の甘い箇所があれば、ご指摘いただけると幸いです。
まずEOLであるものは除外。
有償の機能については検討対象に含むが、実際に使用はしません、懐の問題で。
「まぁ、たぶん明記されてなくてもPostgreならいけるだろ」ぐらいの間抜けな理由で使用DBはPostgreに固定。

#環境

#テーブル構成
employeeテーブルからpostテーブルにID紐づけ

#対応範囲

ORM Transaction Data Model DSL
×
○:対応
×:非対応

#所感

  • エンティティの自動生成がないのツラい
  • コンテナなし環境で使うとEntityManagerの仕様が迂遠に思えますね
  • persistence.xmlとか使うまで忘れてた
  • JPA2.0で注釈処理を使用してメタモデルを生成するようになっている、型セーフ、カラム名変更耐性などがパワーアップ
    • ……メタモデル、他のORMライブラリに比べるとダサくない?
  • EclipseLink2.7.0のjavax.persistenceが署名違いでエラー、なんでや、結局javax.persistence2.1.1を入れる謎回避

#サンプル
##単テーブル検索
###全件検索

Main.java
CriteriaQuery<Employee> query = em.getCriteriaBuilder().createQuery(Employee.class);
em.createQuery(query).getResultStream().forEach(e -> {
    System.out.format("%1s: %2s, %3s, %4s\n", e.id, e.first_name, e.middle_name, e.last_name);
});

###主キー検索

Main.java
CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<Employee> query = builder.createQuery(Employee.class);
Root<Employee> root = query.from(Employee.class);
em.createQuery(query.select(root).where(builder.equal(root.get(Employee_.id), 1L)))
        .getResultStream()
        .forEach(e -> {
    System.out.format("%1s: %2s, %3s, %4s\n", e.id, e.first_name, e.middle_name, e.last_name);
});

##テーブル結合

Main.java
em.createQuery(query.select(root).where(builder.equal(root.get(Employee_.id), 1L)))
        .getResultStream()
        .forEach(e -> {
    System.out.format("%1s: %2s, %3s, %4s\n", e.id, e.first_name, e.middle_name, e.last_name);
    e.posts.stream().forEach(p -> {
        System.out.format("\t%1s: %2s, %3s\n", p.id, p.employee_id, p.name);
    });
});
Employee.java
@Entity
@Table(name="employee")
public class Employee {
    @Id
    public long id;
    public String first_name;
    public String middle_name;
    public String last_name;

    @OneToMany(fetch = FetchType.EAGER)
    @JoinColumn(name = "employee_id", table = "post")
    public List<Post> posts;
}
Post.java
@Entity
@Table(name="post")
public class Post {
    @Id
    public long id;
    public long employee_id;
    public String name;
}

#要点

  • JPA参照実装なのでJPAです

#ハマったポイント

  • 普通にEclipseLink2.7.0を使ってビルドすると「javax.persistenceの署名が異なる」とか怒られる

#後ポスト
まだない。

#参考記事

1
2
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?