一般的に技術系企業が新たな技術に対してフィードバックを得たり、人材を集めたり、サポーターのコミュニティを形成したりするためにオープンソース化することは珍しいことではありません。しかしGoogleは、Transformerをすぐにオープンソース化せず、自社に利益をもたらすサービスに成長させるための研究を続けていました。一方で、AI開発企業のOpenAIはTransformerを用いて、検索大手であるGoogleに対して深刻な脅威になり得るChatGPTを開発しました。
ジェネレーティブAIの進歩に大きな影響を与えた「Transformer」を開発した研究者らはなぜGoogleを去ったのか? - GIGAZINE
⇧ Googleさん、経営が苦しいのかしら?
「JPA(Java Persistence API)」とは?バージョンによっては、「JPA(Jakarta Persistence API)」になっている
公開されてる「JPA(Java Persistence API)」の仕様書によると、
Introduction
This document is the specification of the Java API for the management of persistence and object/relational mapping with Java EE and Java SE. The technical objective of this work is to provide an object/relational mapping facility for the Java application developer using a Java domain model to manage a relational database.
https://download.oracle.com/otn-pub/jcp/persistence-2_2-mrel-spec/JavaPersistence.pdf
⇧ Javaのオブジェクトと「RDBMS(Relational DataBase Management System)」の「ORM(Object Relational Mapping)」の機能を提供することが目的であると。
「ORM(Object Relational Mapping)」はと言うと、
Object–relational mapping (ORM, O/RM, and O/R mapping tool) in computer science is a programming technique for converting data between a relational database and the heap of an object-oriented programming language. This creates, in effect, a virtual object database that can be used from within the programming language.
https://en.wikipedia.org/wiki/Object%E2%80%93relational_mapping
⇧ とあるように、
の間でデータを変換する技術ですと。
で、「JPA(Java Persistence API)」と「JPA(Jakarta Persistence API)」の違いはと言うと、Oracleの公式のブログで、
厳密な意味でのJava EEの最新リリースは、2017年8月のJava EE 8でした。このリリースは範囲が限定されたものでしたが、Java EE Securityなどの重要な機能も含まれていました。その年のうちに、オラクルはJava EEをオープンソース団体に完全に移管することを決めました。そして、Java EEパートナーのRed HatとIBMの協力のもと、完全なリファレンス実装およびTechnology Compatibility Kit(TCK)とともに、Java EEはEclipse Foundationに移管されることに決まりました。
https://blogs.oracle.com/otnjp/post/transition-from-java-ee-to-jakarta-ee-ja
⇧ Java EE 8 から「JPA」の仕様を管理する団体が変わったことにより、名前が変わったらしい。
おそらく、Spring Framework の各プロジェクトで利用されているJava EEのAPIについても、どこかのバージョンでjakarta EEに変わってるんだとは思う。
英語版のWikipediaの「JPA(Jakarta Persistence API)」の説明だと、
Jakarta Persistence API (JPA; formerly Java Persistence API) is a Jakarta EE application programming interface specification that describes the management of relational data in enterprise Java applications.
Persistence in this context covers three areas:
- The API itself, defined in the
jakarta.persistence
package (javax.persistence
for Jakarta EE 8 and below) - The Jakarta Persistence Query Language (JPQL; formerly Java Persistence Query Language)
- Object/relational metadata
The reference implementation for JPA is EclipseLink.
The final release date of the JPA 1.0 specification was 11 May 2006 as part of Java Community Process JSR 220. The JPA 2.0 specification was released 10 December 2009 (the Java EE 6 platform requires JPA 2.0). The JPA 2.1 specification was released 22 April 2013 (the Java EE 7 platform requires JPA 2.1). The JPA 2.2 specification was released in the summer of 2017. The JPA 3.1 specification, the latest version, was released in the spring of 2022 as part of Jakarta EE 10.
⇧ とあるので、APIの仕様書については、
- The Java Persistence 2.1 specification
- The Java Persistence 2.2 specification
- The Jakarta Persistence 3.0 specification
- The Jakarta Persistence 3.1 specification
3.1版が最新っぽいけれど、
Introduction
This document is the specification of the Jakarta API for the management of persistence and object/relational mapping with Jakarta EE and Java SE. The technical objective of this work is to provide an object/relational mapping facility for the Java application developer using a Java domain model to manage a relational database.
https://jakarta.ee/specifications/persistence/3.1/jakarta-persistence-spec-3.1
⇧ 根本的な機能は変わっていないと思う。
話を戻すと、『 Javaのオブジェクトと「RDBMS(Relational DataBase Management System)」の「ORM(Object Relational Mapping)」の機能』が主目的なわけなのだけど、stackoverflowによると、
⇧ 上図のように、
- Java
- JPA(Java Persistence API)
- Hibernate
- JDBC(Java Database Connectivity)
- RDBMS(Relational DataBase Management System)
と経由している。
つまり、「JPA(Java Persistence API)」単独で「RDBMS(Relational DataBase Management System)」とのデータ変換をしてるわけでは無さそう。
「Hibernate」のドキュメントを見た感じ、代表的な2つの利用方法の概要図が紹介されていて、
The "minimal" architecture has the application provide its own JDBC connections and manage its own transactions. This approach uses a minimal subset of Hibernate's APIs:
https://docs.jboss.org/hibernate/core/3.5/reference/en/html/architecture.html
The "comprehensive" architecture abstracts the application away from the underlying JDBC/JTA APIs and allows Hibernate to manage the details.
https://docs.jboss.org/hibernate/core/3.5/reference/en/html/architecture.html
⇧「The "comprehensive" architecture」の方が一般的ということなんかね?
「JPA(Java Persistence API)」以外にも必要なものがあると考えておけば良いんかね?
これについては、
JPA is just an API (hence Java Persistence API) that requires an implementation to use.
https://stackoverflow.com/questions/4477082/what-is-a-jpa-implementation
⇧ 上図のように、「JPA(Java Persistence API)」は仕様であるので、実装が必要であって、その実装が「Hibernate」や「EclipseLink」だったりしますと。
Wikipediaさんによりますと、
Java Persistence API(JPA)とは、関係データベースのデータを扱うJava SEおよびJakarta EE(旧・Java EE)のアプリケーションを開発するためのJava用フレームワークである。
JPAは、以下の3つの部分から成る。
JPAのリファレンス実装はEclipseLinkとして実装されている。
⇧ とのこと。
英語版の「JPA(Jakarta Persistence API)」のWikipediaの情報だと、
JPA 2.2
Development of JPA 2.2, a maintenance release, began in 2017 under JSR 338. The maintenance review was approved on 19 June 2017.
Main features included were:
- The addition of @Repeatable to all relevant annotations
- Support for JPA annotations to be used in metaannotations
- Streaming for query results
- The ability for AttributeConverters to be CDI-injectable
- Support for Java 8 date and time types
Vendors supporting JPA 2.2:
- DataNucleus (from version 5.1)
- EclipseLink (from version 2.7)
- Hibernate (from version 5.3)
- OpenJPA (from version 3.0.0)
Jakarta Persistence 3.0
The JPA was renamed as Jakarta Persistence in 2019 and version 3.0 was released in 2020. This included the renaming of packages and properties from javax.persistence to jakarta.persistence.
Vendors supporting Jakarta Persistence 3.0:
- DataNucleus (from version 6.0)
- EclipseLink (from version 3.0)
- Hibernate (from version 5.5)
Jakarta Persistence 3.1
Version 3.1 was released in 2022. It is part of Jakarta EE 10, and thus requires at least Java 11 to run.
Vendors supporting Jakarta Persistence 3.1:
- DataNucleus (from version 6.0)
- EclipseLink (from version 4.0)
- Hibernate (from version 6.0)
⇧ 詳しくサポートされてる実装が掲載されている。
3.1 で何が変わったかは、
⇧ 上記サイト様がまとめて下さっていました。
Spring Data JPAとは?
で、「Spring Framework 」には、
Spring Data の使命は、基礎となるデータストアの特殊な特性を保持したまま、データアクセス用の使い慣れた一貫した Spring ベースのプログラミングモデルを提供することです。
⇧「Spring Data」というプロジェクトが存在しており、「Spring Data JPA」は、「Spring Data」の内の1つらしく、
より大きな Spring Data ファミリーの一部である Spring Data JPA を使用すると、JPA ベースのリポジトリを簡単に実装できます。このモジュールは、JPA ベースのデータアクセスレイヤーの拡張サポートを扱います。これにより、データアクセステクノロジーを使用する Spring ベースのアプリケーションを簡単に構築できます
1. 序文
Spring Data JPA は、Jakarta Persistence API(JPA)のリポジトリサポートを提供します。これにより、JPA データソースにアクセスする必要のあるアプリケーションの開発が容易になります。
https://spring.pleiades.io/spring-data/jpa/docs/current/reference/html/
⇧「JPA(Java Persistence API)」との関係性がいまいちよく分からん...
公式の情報ではないのだけど、
⇧ 上図のような感じが正しいとすると、「JPA(Java Persistence API)」のラッパーってことになるんかね?
Wikipediaの情報によりますと、
Spring Data JPA
The Spring Data JPA is an implementation of the repository abstraction that is a key building block of domain-driven design based on the Java application framework Spring. It transparently supports all available JPA implementations and supports CRUD operations as well as the convenient execution of database queries.
⇧ とのことなので、「JPA(Java Persistence API)」乃至は「JPA(Jakarta Persistence API)」でできることは全て「Spring Data JPA」でサポートされてるってことみたい。
Spring Data JPAで利用できるクエリ(問い合わせ)が実施されるAPIについて調べてみた
「Last Published: 2012-05-06」とあるので、いまでも有効な情報なのかは分からんのだけど、
⇧「Spring Data JPA」の依存関係を見た感じ、
の2つがあることから、「JPA(Java Persistence API)」の実装である、
- EclipseLink
- Hibernate
に「Spring Data JPA」は対応していそう。
「Spring Data JPA」のドキュメントの「用語集」によると、
⇧ JPAの実装については、
- EclipseLink
- Hibernate
の2つしか記載が無いので、この2つ以外の実装をサポートしているのかは不明だけども、上記の2つの実装についてはサポートされてると考えて良さそうかと。
話が脱線しましたが、クエリのAPIについて、「Spring Data JPA」のドキュメントによりますと、
⇧ という記述から、少なくとも、
- HQL(Hibernate Query Language)
- JPQL(Java Persistence Query Language、Jakarta Persistence Query Language)
- EQL(EclipseLink Query Language)
- native Query
- Criteria API
の5つの方法がある模様。
「条件 API」って説明は、
JPA 2 は、クエリをプログラムで作成するために使用できる条件 API を導入しています。criteria
を記述することにより、ドメインクラスのクエリの where 句を定義します。
https://spring.pleiades.io/spring-data/jpa/docs/current/reference/html/#specifications
⇧ とあるので、
⇧「Criteria API」のことを言っているんだとは思う、たぶん。
何て言うか、Spring Data JPA でクエリが実施されるAPIの全量が把握し辛いなぁ...
学習コストもかかるとは思うけど、その前段階の何が利用可能かを整理し辛いし、使い分けの方針を決めるのも難しいな...
ネットの情報としては、
あたりが多い気がするので、この3つを使っていく感じになるんかな?
毎度モヤモヤ感が半端ない...
今回はこのへんで。