| <?xml version="1.0" encoding="UTF-8"?> |
| <!-- |
| Licensed to the Apache Software Foundation (ASF) under one |
| or more contributor license agreements. See the NOTICE file |
| distributed with this work for additional information |
| regarding copyright ownership. The ASF licenses this file |
| to you under the Apache License, Version 2.0 (the |
| "License"); you may not use this file except in compliance |
| with the License. You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, |
| software distributed under the License is distributed on an |
| "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| KIND, either express or implied. See the License for the |
| specific language governing permissions and limitations |
| under the License. |
| --> |
| <chapter id="jpa_overview_why"> |
| <title> |
| Why JPA? |
| </title> |
| <indexterm zone="jpa_overview_why"> |
| <primary> |
| JPA |
| </primary> |
| <secondary> |
| why |
| </secondary> |
| </indexterm> |
| <para> |
| Java developers who need to store and retrieve persistent data already have |
| several options available to them: serialization, JDBC, JDO, proprietary |
| object-relational mapping tools, object databases, and EJB 2 entity beans. Why |
| introduce yet another persistence framework? The answer to this question is that |
| with the exception of JDO, each of the aforementioned persistence solutions has |
| severe limitations. JPA attempts to overcome these limitations, as illustrated |
| by the table below. |
| </para> |
| <table tocentry="1"> |
| <title> |
| Persistence Mechanisms |
| </title> |
| <tgroup cols="8" align="left" colsep="1" rowsep="1"> |
| <colspec colname="sup"/> |
| <colspec colname="ser"/> |
| <colspec colname="jdbc"/> |
| <colspec colname="or"/> |
| <colspec colname="objdb"/> |
| <colspec colname="ejb2"/> |
| <colspec colname="jdo"/> |
| <colspec colname="jpa"/> |
| <thead> |
| <row> |
| <entry colname="sup"> |
| Supports: |
| </entry> |
| <entry colname="ser"> |
| Serialization |
| </entry> |
| <entry colname="jdbc"> |
| JDBC |
| </entry> |
| <entry colname="or"> |
| ORM |
| </entry> |
| <entry colname="objdb"> |
| ODB |
| </entry> |
| <entry colname="ejb2"> |
| EJB 2 |
| </entry> |
| <entry colname="jdo"> |
| JDO |
| </entry> |
| <entry colname="jpa"> |
| JPA |
| </entry> |
| </row> |
| </thead> |
| <tbody> |
| <row> |
| <entry colname="sup"> |
| Java Objects |
| </entry> |
| <entry colname="ser"> |
| <emphasis role="bold"> |
| Yes |
| </emphasis> |
| </entry> |
| <entry colname="jdbc"> |
| No |
| </entry> |
| <entry colname="or"> |
| <emphasis role="bold"> |
| Yes |
| </emphasis> |
| </entry> |
| <entry colname="objdb"> |
| <emphasis role="bold"> |
| Yes |
| </emphasis> |
| </entry> |
| <entry colname="ejb2"> |
| <emphasis role="bold"> |
| Yes |
| </emphasis> |
| </entry> |
| <entry colname="jdo"> |
| <emphasis role="bold"> |
| Yes |
| </emphasis> |
| </entry> |
| <entry colname="jpa"> |
| <emphasis role="bold"> |
| Yes |
| </emphasis> |
| </entry> |
| </row> |
| <row> |
| <entry colname="sup"> |
| Advanced OO Concepts |
| </entry> |
| <entry colname="ser"> |
| <emphasis role="bold"> |
| Yes |
| </emphasis> |
| </entry> |
| <entry colname="jdbc"> |
| No |
| </entry> |
| <entry colname="or"> |
| <emphasis role="bold"> |
| Yes |
| </emphasis> |
| </entry> |
| <entry colname="objdb"> |
| <emphasis role="bold"> |
| Yes |
| </emphasis> |
| </entry> |
| <entry colname="ejb2"> |
| No |
| </entry> |
| <entry colname="jdo"> |
| <emphasis role="bold"> |
| Yes |
| </emphasis> |
| </entry> |
| <entry colname="jpa"> |
| <emphasis role="bold"> |
| Yes |
| </emphasis> |
| </entry> |
| </row> |
| <row> |
| <entry colname="sup"> |
| Transactional Integrity |
| </entry> |
| <entry colname="ser"> |
| No |
| </entry> |
| <entry colname="jdbc"> |
| <emphasis role="bold"> |
| Yes |
| </emphasis> |
| </entry> |
| <entry colname="or"> |
| <emphasis role="bold"> |
| Yes |
| </emphasis> |
| </entry> |
| <entry colname="objdb"> |
| <emphasis role="bold"> |
| Yes |
| </emphasis> |
| </entry> |
| <entry colname="ejb2"> |
| <emphasis role="bold"> |
| Yes |
| </emphasis> |
| </entry> |
| <entry colname="jdo"> |
| <emphasis role="bold"> |
| Yes |
| </emphasis> |
| </entry> |
| <entry colname="jpa"> |
| <emphasis role="bold"> |
| Yes |
| </emphasis> |
| </entry> |
| </row> |
| <row> |
| <entry colname="sup"> |
| Concurrency |
| </entry> |
| <entry colname="ser"> |
| No |
| </entry> |
| <entry colname="jdbc"> |
| <emphasis role="bold"> |
| Yes |
| </emphasis> |
| </entry> |
| <entry colname="or"> |
| <emphasis role="bold"> |
| Yes |
| </emphasis> |
| </entry> |
| <entry colname="objdb"> |
| <emphasis role="bold"> |
| Yes |
| </emphasis> |
| </entry> |
| <entry colname="ejb2"> |
| <emphasis role="bold"> |
| Yes |
| </emphasis> |
| </entry> |
| <entry colname="jdo"> |
| <emphasis role="bold"> |
| Yes |
| </emphasis> |
| </entry> |
| <entry colname="jpa"> |
| <emphasis role="bold"> |
| Yes |
| </emphasis> |
| </entry> |
| </row> |
| <row> |
| <entry colname="sup"> |
| Large Data Sets |
| </entry> |
| <entry colname="ser"> |
| No |
| </entry> |
| <entry colname="jdbc"> |
| <emphasis role="bold"> |
| Yes |
| </emphasis> |
| </entry> |
| <entry colname="or"> |
| <emphasis role="bold"> |
| Yes |
| </emphasis> |
| </entry> |
| <entry colname="objdb"> |
| <emphasis role="bold"> |
| Yes |
| </emphasis> |
| </entry> |
| <entry colname="ejb2"> |
| <emphasis role="bold"> |
| Yes |
| </emphasis> |
| </entry> |
| <entry colname="jdo"> |
| <emphasis role="bold"> |
| Yes |
| </emphasis> |
| </entry> |
| <entry colname="jpa"> |
| <emphasis role="bold"> |
| Yes |
| </emphasis> |
| </entry> |
| </row> |
| <row> |
| <entry colname="sup"> |
| Existing Schema |
| </entry> |
| <entry colname="ser"> |
| No |
| </entry> |
| <entry colname="jdbc"> |
| <emphasis role="bold"> |
| Yes |
| </emphasis> |
| </entry> |
| <entry colname="or"> |
| <emphasis role="bold"> |
| Yes |
| </emphasis> |
| </entry> |
| <entry colname="objdb"> |
| No |
| </entry> |
| <entry colname="ejb2"> |
| <emphasis role="bold"> |
| Yes |
| </emphasis> |
| </entry> |
| <entry colname="jdo"> |
| <emphasis role="bold"> |
| Yes |
| </emphasis> |
| </entry> |
| <entry colname="jpa"> |
| <emphasis role="bold"> |
| Yes |
| </emphasis> |
| </entry> |
| </row> |
| <row> |
| <entry colname="sup"> |
| Relational and Non-Relational Stores |
| </entry> |
| <entry colname="ser"> |
| No |
| </entry> |
| <entry colname="jdbc"> |
| No |
| </entry> |
| <entry colname="or"> |
| No |
| </entry> |
| <entry colname="objdb"> |
| No |
| </entry> |
| <entry colname="ejb2"> |
| <emphasis role="bold"> |
| Yes |
| </emphasis> |
| </entry> |
| <entry colname="jdo"> |
| <emphasis role="bold"> |
| Yes |
| </emphasis> |
| </entry> |
| <entry colname="jpa"> |
| No |
| </entry> |
| </row> |
| <row> |
| <entry colname="sup"> |
| Queries |
| </entry> |
| <entry colname="ser"> |
| No |
| </entry> |
| <entry colname="jdbc"> |
| <emphasis role="bold"> |
| Yes |
| </emphasis> |
| </entry> |
| <entry colname="or"> |
| <emphasis role="bold"> |
| Yes |
| </emphasis> |
| </entry> |
| <entry colname="objdb"> |
| <emphasis role="bold"> |
| Yes |
| </emphasis> |
| </entry> |
| <entry colname="ejb2"> |
| <emphasis role="bold"> |
| Yes |
| </emphasis> |
| </entry> |
| <entry colname="jdo"> |
| <emphasis role="bold"> |
| Yes |
| </emphasis> |
| </entry> |
| <entry colname="jpa"> |
| <emphasis role="bold"> |
| Yes |
| </emphasis> |
| </entry> |
| </row> |
| <row> |
| <entry colname="sup"> |
| Strict Standards / Portability |
| </entry> |
| <entry colname="ser"> |
| <emphasis role="bold"> |
| Yes |
| </emphasis> |
| </entry> |
| <entry colname="jdbc"> |
| No |
| </entry> |
| <entry colname="or"> |
| No |
| </entry> |
| <entry colname="objdb"> |
| No |
| </entry> |
| <entry colname="ejb2"> |
| <emphasis role="bold"> |
| Yes |
| </emphasis> |
| </entry> |
| <entry colname="jdo"> |
| <emphasis role="bold"> |
| Yes |
| </emphasis> |
| </entry> |
| <entry colname="jpa"> |
| <emphasis role="bold"> |
| Yes |
| </emphasis> |
| </entry> |
| </row> |
| <row> |
| <entry colname="sup"> |
| Simplicity |
| </entry> |
| <entry colname="ser"> |
| <emphasis role="bold"> |
| Yes |
| </emphasis> |
| </entry> |
| <entry colname="jdbc"> |
| <emphasis role="bold"> |
| Yes |
| </emphasis> |
| </entry> |
| <entry colname="or"> |
| <emphasis role="bold"> |
| Yes |
| </emphasis> |
| </entry> |
| <entry colname="objdb"> |
| <emphasis role="bold"> |
| Yes |
| </emphasis> |
| </entry> |
| <entry colname="ejb2"> |
| No |
| </entry> |
| <entry colname="jdo"> |
| <emphasis role="bold"> |
| Yes |
| </emphasis> |
| </entry> |
| <entry colname="jpa"> |
| <emphasis role="bold"> |
| Yes |
| </emphasis> |
| </entry> |
| </row> |
| </tbody> |
| </tgroup> |
| </table> |
| <itemizedlist> |
| <listitem> |
| <para> |
| <indexterm> |
| <primary> |
| serialization |
| </primary> |
| </indexterm> |
| <indexterm> |
| <primary> |
| JPA |
| </primary> |
| <secondary> |
| vs serialization |
| </secondary> |
| </indexterm> |
| <emphasis>Serialization</emphasis> is Java's built-in mechanism for transforming |
| an object graph into a series of bytes, which can then be sent over the network |
| or stored in a file. Serialization is very easy to use, but it is also very |
| limited. It must store and retrieve the entire object graph at once, making it |
| unsuitable for dealing with large amounts of data. It cannot undo changes that |
| are made to objects if an error occurs while updating information, making it |
| unsuitable for applications that require strict data integrity. Multiple threads |
| or programs cannot read and write the same serialized data concurrently without |
| conflicting with each other. It provides no query capabilities. All these |
| factors make serialization useless for all but the most trivial persistence |
| needs. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| <indexterm> |
| <primary> |
| Java Database Connectivity |
| </primary> |
| <see> |
| JDBC |
| </see> |
| </indexterm> |
| <indexterm> |
| <primary> |
| JDBC |
| </primary> |
| </indexterm> |
| <indexterm> |
| <primary> |
| JPA |
| </primary> |
| <secondary> |
| vs JDBC |
| </secondary> |
| </indexterm> |
| Many developers use the <emphasis>Java Database Connectivity</emphasis> (JDBC) |
| APIs to manipulate persistent data in relational databases. JDBC overcomes most |
| of the shortcomings of serialization: it can handle large amounts of data, has |
| mechanisms to ensure data integrity, supports concurrent access to information, |
| and has a sophisticated query language in SQL. Unfortunately, JDBC does not |
| duplicate serialization's ease of use. The relational paradigm used by JDBC was |
| not designed for storing objects, and therefore forces you to either abandon |
| object-oriented programming for the portions of your code that deal with |
| persistent data, or to find a way of mapping object-oriented concepts like |
| inheritance to relational databases yourself. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| <indexterm> |
| <primary> |
| object-relational mapping |
| </primary> |
| <see> |
| ORM |
| </see> |
| </indexterm> |
| <indexterm> |
| <primary> |
| ORM |
| </primary> |
| </indexterm> |
| <indexterm> |
| <primary> |
| JPA |
| </primary> |
| <secondary> |
| vs ORM products |
| </secondary> |
| </indexterm> |
| There are many proprietary software products that can perform the mapping |
| between objects and relational database tables for you. These <emphasis> |
| object-relational mapping</emphasis> (ORM) frameworks allow you to focus on the |
| object model and not concern yourself with the mismatch between the |
| object-oriented and relational paradigms. Unfortunately, each of these product |
| has its own set of APIs. Your code becomes tied to the proprietary interfaces of |
| a single vendor. If the vendor raises prices, fails to fix show-stopping bugs, |
| or falls behind in features, you cannot switch to another product without |
| rewriting all of your persistence code. This is referred to as vendor lock-in. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| <indexterm> |
| <primary> |
| object database |
| </primary> |
| <see> |
| ODB |
| </see> |
| </indexterm> |
| <indexterm> |
| <primary> |
| ODB |
| </primary> |
| </indexterm> |
| <indexterm> |
| <primary> |
| JPA |
| </primary> |
| <secondary> |
| vs ODBs |
| </secondary> |
| </indexterm> |
| <indexterm> |
| <primary> |
| ODBMG |
| </primary> |
| </indexterm> |
| Rather than map objects to relational databases, some software companies have |
| developed a form of database designed specifically to store objects. These |
| <emphasis>object databases</emphasis> (ODBs) are often much easier to use than |
| object-relational mapping software. The Object Database Management Group (ODMG) |
| was formed to create a standard API for accessing object databases; few object |
| database vendors, however, comply with the ODMG's recommendations. Thus, vendor |
| lock-in plagues object databases as well. Many companies are also hesitant to |
| switch from tried-and-true relational systems to the relatively unknown object |
| database technology. Fewer data-analysis tools are available for object database |
| systems, and there are vast quantities of data already stored in older |
| relational databases. For all of these reasons and more, object databases have |
| not caught on as well as their creators hoped. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| <indexterm> |
| <primary> |
| Enterprise Java Beans |
| </primary> |
| <see> |
| EJB |
| </see> |
| </indexterm> |
| <indexterm> |
| <primary> |
| EJB |
| </primary> |
| </indexterm> |
| <indexterm> |
| <primary> |
| JPA |
| </primary> |
| <secondary> |
| vs EJB 2 |
| </secondary> |
| </indexterm> |
| The Enterprise Edition of the Java platform introduced entity Enterprise Java |
| Beans (EJBs). EJB 2.x entities are components that represent persistent |
| information in a datastore. Like object-relational mapping solutions, EJB 2.x |
| entities provide an object-oriented view of persistent data. Unlike |
| object-relational software, however, EJB 2.x entities are not limited to |
| relational databases; the persistent information they represent may come from an |
| Enterprise Information System (EIS) or other storage device. Also, EJB 2.x |
| entities use a strict standard, making them portable across vendors. |
| Unfortunately, the EJB 2.x standard is somewhat limited in the object-oriented |
| concepts it can represent. Advanced features like inheritance, polymorphism, and |
| complex relations are absent. Additionally, EBJ 2.x entities are difficult to |
| code, and they require heavyweight and often expensive application servers to |
| run. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| <indexterm> |
| <primary> |
| JDO |
| </primary> |
| </indexterm> |
| <indexterm> |
| <primary> |
| JPA |
| </primary> |
| <secondary> |
| vs JDO |
| </secondary> |
| </indexterm> |
| The JDO specification uses an API that is strikingly similar to JPA. JDO, |
| however, supports non-relational databases, a feature that some argue dilutes |
| the specification. |
| </para> |
| </listitem> |
| </itemizedlist> |
| <para> |
| <indexterm> |
| <primary> |
| JPA |
| </primary> |
| </indexterm> |
| JPA combines the best features from each of the persistence mechanisms listed |
| above. Creating entities under JPA is as simple as creating serializable |
| classes. JPA supports the large data sets, data consistency, concurrent use, and |
| query capabilities of JDBC. Like object-relational software and object |
| databases, JPA allows the use of advanced object-oriented concepts such as |
| inheritance. JPA avoids vendor lock-in by relying on a strict specification like |
| JDO and EJB 2.x entities. JPA focuses on relational databases. And like JDO, JPA |
| is extremely easy to use. |
| </para> |
| <note> |
| <para> |
| OpenJPA typically stores data in relational databases, but can be customized for |
| use with non-relational datastores as well. |
| </para> |
| </note> |
| <para> |
| JPA is not ideal for every application. For many applications, though, it |
| provides an exciting alternative to other persistence mechanisms. |
| </para> |
| </chapter> |