Scott, this looks like a great tutorial, but any files stored on ASF
servers must follow our license requirements, which includes all source
files must include the appropriate ASF License header.
So, I would ask two things of you:
1) update the tutorial files to include the required headers
http://www.apache.org/legal/src-headers.html
2) open a JIRA and attach the zip as an attachment and select the "Grant
license to ASF for inclusion in ASF works"
https://issues.apache.org/jira/browse/OPENJPA
Thanks,
Donald
On 1/21/10 5:38 PM, [email protected] wrote:
>
>
>
> Begin using OpenJPA - The Basics
>
> <http://cwiki.apache.org/confluence/display/openjpa/Begin+using+OpenJPA+-+The+Basics>
>
>
> Page *edited* by Scott Matthew Quint
> <http://cwiki.apache.org/confluence/display/[email protected]>
>
>
> Introduction
>
> OpenJPA is an open source implementation of the Java JPA (Java
> Persistence API) specification from Apache. JPA provides an agnostic
> Java-based API for storing and retrieving information to a backend
> database. It has a canonical query language named Java Persistence Query
> Language, or JPQL, that blends with the programming methods of Java and
> eliminates the need to tailor database queries for a particular
> database. However, JPA also supports native SQL which can be used for
> quick ports with a known backend database. This tutorial is designed to
> walk you through the steps of setting up a simple web application to use
> OpenJPA Geronimo and to transact the derby database that comes with
> Geronimo. The tutorial code uses a simple Java Server Page (JSP), backed
> up by some basic classes. It displays a table of inventory items and
> categories. In this tutorial, we will not dive into details regarding
> the JSP code. Its purpose is to be a window through which you can
> examine OpenJPA. The intended audience for this tutorial is those with
> some knowledge and understanding of the Java programming language and
> who are just beginning with OpenJPA. To start, you must download the
> following requirements and install them on your computer. For the
> purposes of this tutorial, we are using Eclipse as the IDE and Microsoft
> Windows as the operating system of choice.
>
>
> Prerequisites
>
> *Geronimo V2.2:* You can get it here
> <http://www.apache.org/dyn/closer.cgi/geronimo/2.2/geronimo-tomcat6-javaee5-2.2-bin.zip>.
> Download this file and unzip it to a permanent location. There is no
> installer. The server will run from the command line.
>
> *Java (J2SE) V1.6:* This tutorial was developed and tested with Java
> V1.6. If you don't already have Java V1.6 you can get the IBM JDK here
> <http://www.ibm.com/developerworks/java/jdk/> or the Sun JDK here
> <https://cds.sun.com/is-bin/INTERSHOP.enfinity/WFS/CDS-CDS_Developer-Site/en_US/-/USD/viewproductdetail-start?productref=jdk-6u16-oth-...@cds-cds_developer>.
>
> *Eclipse V3.2 or later:* This version has annotation support included.
> Annotations play a large role in OpenJPA. Download
> <http://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/galileo/SR1/eclipse-jee-galileo-SR1-win32.zip>Eclipse
> 3.2 or later.
>
> *Apache OpenJPA library:* For the purpose of implementing this tutorial
> you can select
> OpenJPA v1.2 or greater. You can download Apache OpenJPA
> <http://openjpa.apache.org/downloads.html> from the Apache site. Note
> that the Milestone (openjpa-all-2.0.0-M3.jar as of this writing) is an
> early release of OpenJPA 2.0 and may have some instabilities. No issues
> have been noted for the usage in this tutorial.
>
> *The tutorial code files*: These files
> </confluence/download/attachments/12320826/OpenJPAWebAppTutorial.zip?version=1>
> are provided with this tutorial. You will add them to your Eclipse project.
>
>
> Setup and Running the Sample
>
> Now, that you have all the prerequisites for this tutorial downloaded
> and installed, the following sections will walk you through the Eclipse
> project setup and the OpenJPA configuration. Make sure you read through
> and follow each part carefully.
>
>
> Setting up Eclipse
>
> After installing Eclipse, create a new project in a dedicated workspace
> for the tutorial. Complete the following setup instructions: First, make
> sure your Eclipse environment is updated and has the Geronimo plugin. If
> you do not know how to do that, follow the instructions found at the
> Geronimo website
> <http://geronimo.apache.org/geronimo-eclipse-plugin-installation-instructions.html>.
>
> 1. Create a new Java project in Eclipse called, *"OpenJPATutorial"*.
> * From the menu, select: *File->New->Enterprise Application
> Project*. (If *Enterprise Application Project* is not
> available as an option, select *Project* and then choose
> *Enterprise Application Project* from the list. Then click
> on the *Next* button).
> When the New Project settings dialog appears, use the
> following settings:
>
>
>
> 2. Under the *Target Runtime* section, select *Apache Geronimo v2.2*.
> * If you do not already have Geronimo setup in Eclipse then
> you will have to do so now. Click on the *New...* button.
> * If Apache Geronimo v2.2 does not appear in the list under
> *Apache*, click the *Download additional server adapters*
> link at the top right of the dialog. If the adapter does not
> appear in that list then follow the directions from the
> Geronimo site
>
> <http://geronimo.apache.org/geronimo-eclipse-plugin-installation-instructions.html>.
>
>
>
>
> * Select *Apache->Apache Geronimo v2.2*
> * Click *Next*.
>
>
>
> * Set the JRE to *jre6* if it is not already set.
> * Browse for the install directory of Geronimo v2.2 on your
> system.
> * Click *Finish*. You should see the following:
>
>
>
> 3. Now, click the *Next* button. You should see this:
>
>
>
> * Check the *Generate application.xml deployment descriptor*
> option.
> * Click the *New Module...* button:
>
>
>
> * De-select *Create default modules*.
> * Select the *Web* option.
> * Click *Next*.
>
>
>
> * Click *Finish*. You will see the following:
>
>
>
> * Click *Finish*.
>
> 4. Now, your Project Explorer should look like this (partially
> expanded):
>
>
>
> * If you double-click on the *Deployment Descriptor:
> OpenJPATutorial*, you should see the application.xml open:
>
>
>
> 5. Now we will bring in the sample code. The easiest way to add the
> sample code is to find the source provided with this tutorial and
> copy it to the src folder under the *OpenJPATutorialWeb* folder in
> your project directory in Windows Explorer:
>
>
>
> * Now go back to Eclipse. Right-click on the
> *OpenJPATutorialWeb* folder in the Project Explorer view and
> select *Refresh,* or press the *F5* key on your keyboard.
> Now you will see this:
>
>
>
> Notice that all the source files compile without error. That
> is because Geronimo comes with OpenJPA v1.1 built in.
>
> 6. Now copy the index.jsp file from the tutorial into the Web Content
> directory under the Project directory in Windows Explorer:
>
>
>
> * Got to the Project Explorer and refresh the project. You
> should see this:
>
>
>
>
> Running and Configuring Geronimo and Derby
>
> Geronimo has no installer and runs from the command line. Here are some
> quick instructions to get you started.
>
> 1. In Windows, open a command prompt and navigate to the Geronimo
> *bin* directory.
> 2. Type the command:
>
> start-server
>
>
>
>
>
> Press the *Enter* key.
>
>
>
> 3. Open a web browser and go to the address:
>
> http://localhost:8080/console
>
>
>
>
>
> The default password is /manager/.
>
> 4. You will come to the Welcome page. On the left menu, at the
> bottom, find the section for the Embedded DB. This is the Derby
> database control page.
>
>
>
>
> 5. Click on the link for the *DB Manager*.
> 6. You will see two sections: *DB Viewer* and *Run SQL*.
> 7. In the Run SQL section, in the text field labeled Create DB, type
> in *StoreSystem*. This is the name of the database that the
> OpenJPA sample is configured to transact.
>
>
>
>
> 8. Click on the *Create* button. You should now see the *StoreSystem*
> database appear in the*DB Viewer* section.
>
>
>
>
> 9. We are now ready to deploy and run the sample code.
>
>
> Running and Deploying the Sample Code in Geronimo
>
> The sample code provided with this tutorial is working code. It is a
> simple inventory database program that shows items and categories. But
> even this simple example requires the ability to add, edit and delete
> entries. It requires the ability to sort and filter database queries and
> it requires the identification of the relationship of the items to the
> categories. In this example, the relationship is *one to many*. Knowing
> that relationship is important to how the code is written. Before we
> analyze the code and OpenJPA, we will first deploy the sample and see it
> work. To deploy the sample code follow these instructions:
>
> 1. In Eclipse, in the Project Explorer, right click on the
> OpenJPATutorial project and select: *Export->EAR file*.
>
>
>
>
> 2. In the Ear Export dialog, find a convenient place to put the
> exported EAR file.
> 3. Check the *Overwrite existing file* check box.
>
>
>
>
> 4. Click *Finish*.
> 5. Go out to Windows Explorer and copy the file
> *TutorialDeploymentPlan.xml* to the location of the exported ear.
> This is the deployment plan that Geronimo requires to deploy the
> application.
>
>
>
>
> 6. Open the Geronimo console in a web browser and log in.
> 7. In the Console Navigation menu on the left, under the
> *Applications* section, click on the *Deploy New* item.
> 8. Browse to the location of the exported EAR file and the deployment
> plan XML file.
>
>
>
>
> 9. Click on the *Install* button. You should see this.
>
>
>
>
> 10. In the Console Navigation menu on the left, under the
> *Applications* section, click on the *Web App WARs* item.
> * Notice that the OpenJPATutorial application is now listed
> and that there is a clickable link under the URL heading:
>
>
>
>
> 11. Click on the link *OpenJPATutorial* and now you should see this:
>
>
>
>
> Each of the buttons will execute OpenJPA code. The lists are
> filled by running queries on the Derby database.
> 1. Add a some categories and items
> 2. Make sure you test each of the buttons and see the results.
>
>
> Examining the Sample Code
>
> Now that everything is set up and you have seen it work, let's look more
> closely at the parts of the code that use OpenJPA. The JSP code is just
> a prop to explore OpenJPA and we will not examine it.The sample
> application source code is provided for this tutorial and you may run
> as-is with no customizations. However, you have the option of
> reproducing the code manually using the following explanations.
> Whichever method you choose, locate the code that corresponds to
> explanations as you follow along.
>
> * Java code: This tutorial comes with the following java source files:
> o index.jsp: This is the interface code only. It does call
> into other classes but it does not use any OpenJPA code
> directly.
> o InventoryEntityBroker.java: This class contains methods that
> encapsulate the OpenJPA handling code. It is provided as a
> way to separate OpenJPA functionality from the web interface.
> o InventoryItem.java: This is an OpenJPA Entity class file.
> This file is an example of a simple OpenJPA Entity with a
> relationship.
> o InventoryCategory.java: This is an OpenJPA Entity class
> file. This file is an example of a simple OpenJPA Entity
> with a relationship.
> * Persistence code: Each entity concept that would be a database
> table will be its own class. In this case, the tables are called
> "InventoryItem" and "InventoryCategory". Annotations in the Java
> file will associate the properties with the database columns. The
> annotation, @Column, maps the property name to the column name for
> synchronization with the database. If the table corresponding
> tables do not exist, OpenJPA can use these annotations to create
> the tables' schema dynamically based on the property type and length.
>
> *InventoryCategory.java*
>
> package tutorial;
> import java.util.List;
>
> import javax.persistence.CascadeType;
> import javax.persistence.Column;
> import javax.persistence.Entity;
> import javax.persistence.GeneratedValue;
> import javax.persistence.GenerationType;
> import javax.persistence.Id;
> import javax.persistence.OneToMany;
> import javax.persistence.Version;
>
> @Entity
> public class InventoryCategory
> {
> private int version;
> private int id;
>
> private String categoryName;
> private String categoryDescription;
>
> List<InventoryItem> items;
>
> public InventoryCategory(){}
>
> @Column(name = "categoryName")
> public String getCategoryName()
> {
> return categoryName;
> }
>
> public void setCategoryName(String name)
> {
> this.categoryName = name;
> }
>
> @Column(name = "itemDescription")
> public String getCategoryDescription()
> {
> return categoryDescription;
> }
>
> public void setCategoryDescription(String description)
> {
> this.categoryDescription = description;
> }
>
> @Version
> @Column(name = "version_field")
> // not required
> public int getVersion()
> {
> return version;
> }
>
> public void setVersion(int version)
> {
> this.version = version;
> }
>
> @Id
> @GeneratedValue(strategy = GenerationType.AUTO)
> public int getId()
> {
> return id;
> }
>
> public void setId(int id)
> {
> this.id = id;
> }
>
> @OneToMany(targetEntity=tutorial.InventoryItem.class,
> cascade=CascadeType.ALL,
> mappedBy="category")
> public List<InventoryItem> getItems()
> {
> return items;
> }
>
> public void setItems(List<InventoryItem> items)
> {
> this.items = items;
> }
>
> public void addItem(InventoryItem item)
> {
> this.items.add(item);
> }
> }
>
>
> *Note*
>
> In this example, the property annotations ( @Column,@Version, and @Id)
> are placed on the getter methods. They can alternatively be placed on
> the property declarations. For more information on these annotations and
> to see what other annotations are in OpenJPA, see the Apache OpenJPA 2.0
> User's Guide: Chapter 5
> <http://openjpa.apache.org/builds/latest/docs/manual/jpa_overview_meta.html>
>
> * The annotated class and property declarations are all that are
> required.
> * The *...@id* annotation is needed as the unique identifier (primary
> key) for each record.
> * The *...@version* annotation is common practice. It ensures data
> integrity during merges and acts as an optimistic concurrency control.
> * Every property must have both a getter and a setter and the
> standard case convention must be observed.
> ° Correct: *public* *void* setCategoryName(String name)
> ° Incorrect: *public* *void* setcategoryname(String name)
>
>
> * Persistence.xml: JPA requires the use of a XML file called the
> "persistence.xml" that describes how to access the data. The XML
> file must be created in the META-INF directory. The META-INF
> directory containing the persistence.xml must be located with the
> source files.
>
>
>
>
> In the following example, the file only requires a few fields.
>
> *META-INF/persistence.xml*
>
> <persistence xmlns=http://java.sun.com/xml/ns/persistence
> xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
> version="1.0">
> <persistence-unit name="InventorySystem"
> transaction-type="RESOURCE_LOCAL">
> <class>tutorial.InventoryItem</class>
> <class>tutorial.InventoryCategory</class>
> <properties>
> <property name="openjpa.jdbc.SynchronizeMappings"
> value="buildSchema"/>
> <property name="openjpa.ConnectionURL"
> value="jdbc:derby://localhost:1527/StoreSystem"/>
> <property name="openjpa.ConnectionDriverName"
> value="org.apache.derby.jdbc.ClientDriver"/>
> </properties>
> </persistence-unit>
> </persistence>
>
>
>
> * The following elements are specific to this tutorial:
> o *persistence-unit*: the *name* is the table name to bind. In
> this case it is 'person'.
> o *class*: the java class that is bound to the table 'person'.
> o *property:* openjpa.jdbc.SynchronizeMappings: This tells
> OpenJPA to automatically create the table with the class
> definition if a table does not already exist.
> o *property:* openjpa.ConnectionURL: The URL of the database
> connection.
> o *property:* openjpa.ConnectionDriverName: the class name of
> the JDBC driver for Derby. This must be available via the
> classpath. In this tutorial, the driver is built into
> Geronimo so no extra actions are needed.
> * A complete explanation of the persistence.xml is in the Apache
> OpenJPAV2.0 user's Guide: Chapter 6
>
> <http://openjpa.apache.org/builds/latest/docs/manual/jpa_overview_persistence.html>
>
> * Create the Entity Manager. In the provided code, the EntityManager
> is a property of the InventoryEntityBroker class. The Entity
> Manager controls the interaction with the database. You must use
> the Entity Manager to start or access transactions or to send
> queries.
> o The following code must be added before using any of the
> persistence APIs (If you are using the provided sample code,
> this is already included):
>
> EntityManagerFactory factory =
> Persistence.createEntityManagerFactory("InventorySystem",
> System.getProperties());
>
> EntityManager em = factory.createEntityManager();
>
> o Note that the name, "InventorySystem", is the same one
> identified in the persistence.xml.
> o This code can be placed just before a query or transaction
> or they can be class properties.
> o Regardless of the scope, the EntityManager and the
> EntityManagerFactory should be closed when they are no
> longer needed:
>
> ...
> em.close();
> factory.close();
> ...
>
> o The EntityManagerFactory and EntityManager full descriptions
> are in the following OpenJPA documentation:
> + EntityManagerFactory:
>
> http://openjpa.apache.org/builds/latest/docs/manual/jpa_overview_emfactory.html
> + EntityManager:
>
> http://openjpa.apache.org/builds/latest/docs/manual/jpa_overview_em.html
>
> * DB interface class. In this example, the InventoryEntityBroker
> class contains all the OpenJPA database interaction code. This is
> not required but it is a good idea for keeping the functionality
> componentized. For example, if you want to pull all of the records
> from the InventoryItem table, the code would look like this:
> *InventoryEntityBroker.java*
>
> ...
> List<Person> getAllItems()
> {
> Query q = em.createQuery("SELECT item FROM InventoryItem item");
>
> return (List<InventoryItem>)q.getResultList();
> }
> ...
>
> *index.jsp*
>
> ...
> List<InventoryItem> itemList = getAllItems();
> ...
>
> o All of the specific APIs are described in the OpenJPA
> javadoc
> <http:/openjpa.apache.org/builds/latest/docs/javadoc/index.html>
> o Notice that the Query is not standard SQL. It is actually
> JPQL, which is a specialized form of query language
> specifically designed for JPA.
> + In the JPQL statement, "SELECT item FROM InventoryItem
> item", notice that InventoryItem has the same case as
> the class InventoryItem.
> + JPQL uses java objects in the query and not the
> database table names. The statement identifies the
> variable for InventoryItem as "item".
> + JPQL provides an object oriented query language that
> is independent of the database being queried. So,
> regardless of which database being used, the JPQL does
> not change. The JPA runtime takes care of doing the
> translation from the object world to the desired
> relational database.
> + For more information on JPQL, check out this Java
> Persistence Querly Language reference.
>
> <http://java.sun.com/javaee/5/docs/tutorial/backup/update3/doc/QueryLanguage.html>
>
> * Also in the InventoryEntityBroker is code to add entries the
> database tables. Since you did not create a table for
> InventoryItem in the StoreSystem database in Derby, OpenJPA 2.0
> will create the table the first time an /"add"/ is attempted.
> o Consider the following code:
> *InventoryEntityBroker*
>
> ...
> void addItem(String name, String description, float price, int
> categoryID)
> {
> InventoryItem item = new InventoryItem();
> item.setName(name);
> item.setDescription(description);
> ...
>
> em.persist(item);
> }
> ...
>
> You can then call the addItem() method in another part of
> the code. The EntityManager.persist() method will throw an
> exception if a transaction has not been started. The
> transaction must be committed by calling the
> Transaction.commit() method after all updates have been
> applied or else the changes will not be saved to the database:
>
> ...
> em.getTransaction().begin();
>
> addItem(...);
>
> em.getTransaction().commit();
> ...
>
> + When this is executed the first time it will use the
> annotations to create the Person table, then OpenJPA
> 2.0 will populate it with the provided data.
> + Note the use of the getTransaction() method to start
> an update and then to commit it. The concept is the
> same as in any database transaction processing.
> + Also note that while the getAllItems() function
> requires a JPQL SELECT query, the update type actions
> have APIs.
> + Take a look in the InventoryEntityBroker code at the
> addItem(), updateItem() and deleteItem() functions and
> note the simplicity of these operations.
>
> * An important aspect of relational databases is, of course, the
> relationships. The basic relationship types are: one to many, many
> to one, and many to many. OpenJPA provides annotations to identify
> the related fields.
> Open the source file, InventoryCategory.java in Eclipse and find
> the following code:
> *InventoryCategory.java*
>
> ...
> @OneToMany(targetEntity=tutorial.InventoryItem.class,
> cascade=CascadeType.ALL,
> mappedBy="category")
> public List<InventoryItem> getItems()
> {
> return items;
> }
> ...
>
> o The annotation @OneToMany identifies that:
> + This object has a one-to-many relationship with
> targetEntity=tutorial.InventoryItem.class. Meaning
> that one InventoryCategory can have many
> InventoryItems associated with it.
> + The property of InventoryItem that specifies the
> InventoryCategory it is associated with is
> mappedBy="category". In other words, InventoryItem has
> a class property of type InventoryCategory named
> "category".
> Now open the source file, InventoryItem.java and find
> the following code:
> *InventoryItem.java*
>
> ...
> @ManyToOne
> @JoinColumn(name="CAT_ID", nullable=false)
> public InventoryCategory getCategory()
> {
> return category;
> }
> ...
>
> + The annotation @ManyToOne identifies that:
> + This object has a many-to-one relationship with the
> InventoryCategory object. Meaning that there many
> InventoryItems can reference the same InventoryCategory
> o The annotation @JoinColumn identifies that:
> + The column in the database table that holds the
> InventoryCategory reference by the attribute:
> name="CAT_ID".
> *Remember*
>
> These annotations contribute to the creation of the
> tables and the relationships. It is important to put
> as much thought into how these objects relate to each
> other as you would if you were designing the database
> tables because you are designing the database tables.
> You can see more about the relationship annotations at
> the Apache OpenJPA site. The documentation is here
>
> <http://openjpa.apache.org/builds/latest/docs/manual/jpa_overview_meta_field.html>.
>
>
> Summary
>
> This was a very basic example of how to use OpenJPA with Geronimo and
> Derby. However, many applications that require database persistence do
> not use much more than the basic functionality demonstrated in this
> tutorial. The purpose of this was to be a primer. Aside from the setup
> of the server and database, we went through the creation of a
> persistence.xml file, the basics of the OpenJPA Entity, and
> EntityManager and some of the functionality.
> *Exercises*
> Using this sample code as a base, try to do some of the following:
>
> * Add additional fields to the InventoryItem Entity.
> * Create a Customer Entity and establish a one-to-many relationship
> with the InventoryItems as one customer having purchased many items.
> * Since several customers could have purchased the same items and an
> item could have been purchased by many customers, use the
> documentation to create a many-to-many relationship using
> @ManyToMany*.
>
> _*To make these changes you may have to delete the existing database
> tables so that they can recreated with the new relationship fields.
>
>
> References
>
> * *Java J2SE 1.6*
> o Download
>
> <https://cds.sun.com/is-bin/INTERSHOP.enfinity/WFS/CDS-CDS_Developer-Site/en_US/-/USD/viewproductdetail-start?productref=jdk-6u16-oth-...@cds-cds_developer>
> * *
> * *Apache Sources*
> o *Geronimo*
> + Geronimo Homepage <http://geronimo.apache.org/>
> + Geronimo V2.2 Server Documentation
> <http://cwiki.apache.org/GMOxDOC22/documentation.html>
> + Geronimo V2.2 Server download
>
> <http://www.apache.org/dyn/closer.cgi/geronimo/2.2/geronimo-tomcat6-javaee5-2.2-bin.zip>
> o *JPA*
> + Apache OpenJPA home page <http://openjpa.apache.org/>
> + Apache OpenJPA download
> <http://openjpa.apache.org/downloads.html>
> + Apache OpenJPA documentation
> <http://openjpa.apache.org/documentation.html>
>
> * *Annotations*
> o Documentation for Java Annotations
>
> <http://java.sun.com/j2se/1.5.0/docs/guide/language/annotations.html>
> * *JPQL*
> o A reference for JPQL
>
> <http://java.sun.com/javaee/5/docs/tutorial/backup/update3/doc/QueryLanguage.html>
> * *Blogs*
> o Discussion on The Server Side
> <http://www.theserverside.com/news/thread.tss?thread_id=58343>
> o Websphere & OpenJPA blog on blogspot
> <http://bit.ly/JPATutBlogApache>
> o JPA Blog on developerWorks <http://bit.ly/JPATutApachedwBlog>
> * *Implementation Sites*
> o IBM WebSphere Application Server V7 Java Persistence API
> (JPA) 2.0 Open Alpha <http://bit.ly/JPATutBlogApache>
>
> Change Notification Preferences
> <http://cwiki.apache.org/confluence/users/viewnotifications.action>
> View Online
> <http://cwiki.apache.org/confluence/display/openjpa/Begin+using+OpenJPA+-+The+Basics>
> | View Change
> <http://cwiki.apache.org/confluence/pages/diffpagesbyversion.action?pageId=12320826&revisedVersion=5&originalVersion=4>
> | Add Comment
> <http://cwiki.apache.org/confluence/display/openjpa/Begin+using+OpenJPA+-+The+Basics?showComments=true&showCommentArea=true#addcomment>
>