You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by mp...@apache.org on 2006/11/16 00:41:37 UTC

svn commit: r475498 - in /incubator/openjpa/trunk: openjpa-examples/ openjpa-examples/src/main/java/META-INF/ openjpa-examples/src/main/java/relations/ openjpa-persistence-jdbc/ openjpa-project/

Author: mprudhom
Date: Wed Nov 15 15:41:37 2006
New Revision: 475498

URL: http://svn.apache.org/viewvc?view=rev&rev=475498
Log:
Added 'relations' example to demonstrate defining and querying relations in JPA; also upgraded the version of Derby included in the release for example usage to be 10.2.1.6 in order to keep up

Added:
    incubator/openjpa/trunk/openjpa-examples/src/main/java/relations/
    incubator/openjpa/trunk/openjpa-examples/src/main/java/relations/Deity.java
    incubator/openjpa/trunk/openjpa-examples/src/main/java/relations/Main.java
    incubator/openjpa/trunk/openjpa-examples/src/main/java/relations/build.xml
Modified:
    incubator/openjpa/trunk/openjpa-examples/pom.xml
    incubator/openjpa/trunk/openjpa-examples/src/main/java/META-INF/persistence.xml
    incubator/openjpa/trunk/openjpa-persistence-jdbc/pom.xml
    incubator/openjpa/trunk/openjpa-project/pom.xml

Modified: incubator/openjpa/trunk/openjpa-examples/pom.xml
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-examples/pom.xml?view=diff&rev=475498&r1=475497&r2=475498
==============================================================================
--- incubator/openjpa/trunk/openjpa-examples/pom.xml (original)
+++ incubator/openjpa/trunk/openjpa-examples/pom.xml Wed Nov 15 15:41:37 2006
@@ -39,7 +39,7 @@
         <dependency>
             <groupId>org.apache.derby</groupId>
             <artifactId>derby</artifactId>
-            <version>10.1.3.1</version>
+            <version>10.2.1.6</version>
             <scope>test</scope>
         </dependency>
         <dependency>

Modified: incubator/openjpa/trunk/openjpa-examples/src/main/java/META-INF/persistence.xml
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-examples/src/main/java/META-INF/persistence.xml?view=diff&rev=475498&r1=475497&r2=475498
==============================================================================
--- incubator/openjpa/trunk/openjpa-examples/src/main/java/META-INF/persistence.xml (original)
+++ incubator/openjpa/trunk/openjpa-examples/src/main/java/META-INF/persistence.xml Wed Nov 15 15:41:37 2006
@@ -17,6 +17,16 @@
 <persistence xmlns="http://java.sun.com/xml/ns/persistence"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     version="1.0">
+
+    <!--
+        We need to enumerate each persistent class first in the persistence.xml
+        See: http://issues.apache.org/jira/browse/OPENJPA-78
+    -->
+    <persistence-unit name="none" transaction-type="RESOURCE_LOCAL">
+        <class>hellojpa.Message</class>
+        <class>relations.Deity</class>
+    </persistence-unit>
+
     <!--
         A persistence unit is a set of listed persistent entities as well
         the configuration of an EntityManagerFactory. We configure each
@@ -26,11 +36,14 @@
         <!--
             The default provider can be OpenJPA, or some other product.
             This element is optional if OpenJPA is the only JPA provider
-            in the current classloading environment.
+            in the current classloading environment, but can be specified
+            in cases where there are multiple JPA implementations available.
         -->
+        <!--
         <provider>
             org.apache.openjpa.persistence.PersistenceProviderImpl
         </provider>
+        -->
 
         <!-- We must enumerate each entity in the persistence unit -->
         <class>hellojpa.Message</class>
@@ -53,5 +66,10 @@
                 value="secret"/>
             -->
         </properties>
+    </persistence-unit>
+
+    <!-- persistence unit for the "relations" example -->
+    <persistence-unit name="relations" transaction-type="RESOURCE_LOCAL">
+        <class>relations.Deity</class>
     </persistence-unit>
 </persistence>

Added: incubator/openjpa/trunk/openjpa-examples/src/main/java/relations/Deity.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-examples/src/main/java/relations/Deity.java?view=auto&rev=475498
==============================================================================
--- incubator/openjpa/trunk/openjpa-examples/src/main/java/relations/Deity.java (added)
+++ incubator/openjpa/trunk/openjpa-examples/src/main/java/relations/Deity.java Wed Nov 15 15:41:37 2006
@@ -0,0 +1,203 @@
+/*
+ * Copyright 2006 The Apache Software Foundation.
+ *
+ * Licensed 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.
+ */
+package relations;
+
+import java.io.Serializable;
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.persistence.Basic;
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.Enumerated;
+import javax.persistence.EnumType;
+import javax.persistence.Id;
+import javax.persistence.NamedQuery;
+import javax.persistence.NamedQueries;
+import javax.persistence.OneToMany;
+import javax.persistence.OneToOne;
+
+
+/** 
+ * An entity that contains relations corresponding to family tree relations.
+ * This entity demonstrates the following JPA features:
+ *
+ * 1. Enum fields (gender)
+ * 2. @OneToOne relations
+ * 3. @OneToMany relations
+ * 4. Named queries
+ */
+@Entity
+@NamedQueries({
+
+    // a sibling shares a mother and a father
+    @NamedQuery(name="siblings", query="select distinct sibling1 "
+        + "from Deity sibling1, Deity sibling2 where "
+        + "sibling1.father = sibling2.father "
+        + "and sibling1.mother = sibling2.mother "
+        + "and sibling2 = ?1 and sibling1 <> ?1"),
+
+    // a half-siling shares a mother or a father, but not both
+    @NamedQuery(name="half-siblings", query="select distinct sibling1 "
+        + "from Deity sibling1, Deity sibling2 where "
+        + "((sibling1.father = sibling2.father "
+        + "and sibling1.mother <> sibling2.mother) "
+        + "or (sibling1.father <> sibling2.father "
+        + "and sibling1.mother = sibling2.mother)) "
+        + "and sibling2 = ?1 and sibling1 <> ?1"),
+
+    // a half-siling shares a mother or a father, but not both
+    @NamedQuery(name="half-siblings", query="select distinct sibling1 "
+        + "from Deity sibling1, Deity sibling2 where "
+        + "((sibling1.father = sibling2.father "
+        + "and sibling1.mother <> sibling2.mother) "
+        + "or (sibling1.father <> sibling2.father "
+        + "and sibling1.mother = sibling2.mother)) "
+        + "and sibling2 = ?1 and sibling1 <> ?1"),
+
+    // a cousin shares a grandparent, but is not a sibling
+    @NamedQuery(name="cousins", query="select distinct cousin1 "
+        + "from Deity cousin1, Deity cousin2 where "
+        + "("
+            + "cousin1.father.father = cousin2.father.father "
+            + "or cousin1.father.mother = cousin2.father.mother "
+            + "or cousin1.mother.father = cousin2.mother.father "
+            + "or cousin1.mother.mother = cousin2.mother.mother) "
+        + "and (cousin1.father <> cousin2.father) "
+        + "and (cousin1.mother <> cousin2.mother) "
+        + "and cousin2 = ?1 and cousin1 <> ?1")
+    })
+public class Deity implements Serializable {
+    // the Id is the name, which is generally a bad idea, but we are
+    // confident that diety names will be unique
+    @Id
+    private String name;
+
+    @Basic @Enumerated(EnumType.STRING)
+    private Gender gender;
+
+    @OneToOne(cascade=CascadeType.ALL)
+    private Deity mother;
+
+    @OneToOne(cascade=CascadeType.ALL)
+    private Deity father;
+
+    @OneToMany(cascade=CascadeType.ALL)
+    private Set<Deity> children;
+
+    public static enum Gender { MALE, FEMALE }
+
+
+    public Deity(String name, Gender gender) {
+        this.name = name;
+        this.gender = gender;
+    }
+
+
+    //////////////////////////
+    // Business methods follow
+    //////////////////////////
+
+    /** 
+     * She's having a baby... 
+     *  
+     * @param  firstName  the baby name
+     * @return the new child
+     *
+     * @throws IllegalArgumentException if the person is not a woman, or
+     *                                  if the person is unmarried (illegitimate
+     *                                  children are not yet supported)
+     */
+    public Deity giveBirth(String childName, Deity childFather, Gender gender) {
+        if (this.gender != Gender.FEMALE)
+            throw new IllegalArgumentException("Only women can have children!");
+
+        if (childName == null)
+            throw new IllegalArgumentException("No child name!");
+
+        // create the child
+        Deity child = new Deity(childName, gender);
+
+        // set the parents in the children...
+        child.mother = this;
+
+        // add the child to this member's children
+        if (children == null)
+            children = new HashSet<Deity>();
+        children.add(child);
+
+        if (childFather != null) {
+            child.father = childFather;
+            if (childFather.children == null)
+                childFather.children = new HashSet<Deity>();
+            childFather.children.add(child);
+        }
+
+        return child;
+    }
+
+
+    ////////////////////////////////////
+    // Property accessor methods follow
+    ////////////////////////////////////
+
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getName() {
+        return this.name;
+    }
+
+
+    public void setGender(Gender gender) {
+        this.gender = gender;
+    }
+
+    public Gender getGender() {
+        return this.gender;
+    }
+
+
+    public void setMother(Deity mother) {
+        this.mother = mother;
+    }
+
+    public Deity getMother() {
+        return this.mother;
+    }
+
+
+    public void setFather(Deity father) {
+        this.father = father;
+    }
+
+    public Deity getFather() {
+        return this.father;
+    }
+
+
+    public void setChildren(Set<Deity> children) {
+        this.children = children;
+    }
+
+    public Set<Deity> getChildren() {
+        return this.children;
+    }
+
+}
+

Added: incubator/openjpa/trunk/openjpa-examples/src/main/java/relations/Main.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-examples/src/main/java/relations/Main.java?view=auto&rev=475498
==============================================================================
--- incubator/openjpa/trunk/openjpa-examples/src/main/java/relations/Main.java (added)
+++ incubator/openjpa/trunk/openjpa-examples/src/main/java/relations/Main.java Wed Nov 15 15:41:37 2006
@@ -0,0 +1,167 @@
+/*
+ * Copyright 2006 The Apache Software Foundation.
+ *
+ * Licensed 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.
+ */
+package relations;
+
+import java.util.*;
+import javax.persistence.*;
+
+// import the enums for MALE and FEMALE
+import static relations.Deity.Gender.*;
+
+
+/** 
+ * A very simple, stand-alone program that stores a new entity in the
+ * database and then performs a query to retrieve it.
+ */
+public class Main {
+
+    @SuppressWarnings("unchecked")
+    public static void main(String[] args) {
+        // Create a new EntityManagerFactory using the System properties.
+        // The "relations" name will be used to configure based on the
+        // corresponding name in the META-INF/persistence.xml file
+        EntityManagerFactory factory = Persistence.
+            createEntityManagerFactory("relations", System.getProperties());
+
+        // Create a new EntityManager from the EntityManagerFactory. The
+        // EntityManager is the main object in the persistence API, and is
+        // used to create, delete, and query objects, as well as access
+        // the current transaction
+        EntityManager em = factory.createEntityManager();
+
+        initFamilyTree(em);
+
+        runQueries(em);
+
+        // It is always good to clean up after ourselves
+        em.close();
+        factory.close();
+    }
+
+    /** 
+     * Creates a partial family tree of the Greek dieties.
+     *  
+     * @param  em  the EntityManager to use in the persistence process
+     */
+    public static void initFamilyTree(EntityManager em) {
+
+        // First delete all the members from the database the clean up
+        em.getTransaction().begin();
+        em.createQuery("delete from Deity").executeUpdate();
+        em.getTransaction().commit();
+
+        // Generation 1
+        Deity uranus = new Deity("Uranus", MALE);
+        Deity gaea = new Deity("Gaea", FEMALE);
+
+        // Generation 2
+        Deity cronus = gaea.giveBirth("Cronus", uranus, MALE);
+        Deity rhea = gaea.giveBirth("Rhea", uranus, FEMALE);
+        Deity coeus = gaea.giveBirth("Coeus", uranus, MALE);
+        Deity phoebe  = gaea.giveBirth("Phoebe", uranus, FEMALE);
+        Deity oceanus = gaea.giveBirth("Oceanus", uranus, MALE);
+        Deity tethys = gaea.giveBirth("Tethys", uranus, FEMALE);
+
+        // Generation 3
+        Deity leto = phoebe.giveBirth("Leto", coeus, FEMALE);
+
+        Deity hestia = rhea.giveBirth("Hestia", cronus, FEMALE);
+        Deity pluto = rhea.giveBirth("Pluto", cronus, MALE);
+        Deity poseidon = rhea.giveBirth("Poseidon", cronus, MALE);
+        Deity zeus = rhea.giveBirth("Zeus", cronus, MALE);
+        Deity hera = rhea.giveBirth("Hera", cronus, FEMALE);
+        Deity demeter = rhea.giveBirth("Demeter", cronus, FEMALE);
+
+        // Generation 4
+        Deity iapetus = tethys.giveBirth("Iapetus", coeus, MALE);
+        Deity clymene = new Deity("Clymene", FEMALE);
+
+        Deity apollo = leto.giveBirth("Apollo", zeus, MALE);
+        Deity artemis = leto.giveBirth("Artemis", zeus, MALE);
+
+        Deity persephone = demeter.giveBirth("Persephone", zeus, MALE);
+
+        Deity ares = hera.giveBirth("Ares", zeus, MALE);
+        Deity hebe = hera.giveBirth("Hebe", zeus, FEMALE);
+        Deity hephaestus = hera.giveBirth("Hephaestus", zeus, MALE);
+
+        Deity prometheus = clymene.giveBirth("Prometheus", iapetus, MALE);
+        Deity atlas = clymene.giveBirth("Atlas", iapetus, MALE);
+        Deity epimetheus = clymene.giveBirth("Epimetheus", iapetus, FEMALE);
+
+        Deity dione = new Deity("Dione", FEMALE);
+        dione.giveBirth("Aphrodite", zeus, FEMALE);
+
+        // Begin a new local transaction so that we can persist a new entity
+        em.getTransaction().begin();
+
+        // note that we only need to explicitly persist a single root of the
+        // object graph (the family tree, in this case), since we have the
+        // "cascade" annotation on all the relations
+        em.persist(zeus);
+
+        // Commit the transaction, which will cause the entity to
+        // be stored in the database
+        em.getTransaction().commit();
+    }
+
+    /** 
+     * Run some sample queries against the family tree model.
+     *  
+     * @param  em  the EntityManager to use
+     */
+    public static void runQueries(EntityManager em) {
+
+        System.out.println("Running query to find all instances..");
+
+        // Perform a simple query for all the Deity entities
+        Query q = em.createQuery("select x from Deity x");
+
+        // Go through each of the entities and print out each of their
+        // messages, as well as the date on which it was created 
+        for (Deity m : (List<Deity>)q.getResultList()) {
+            System.out.println(m.getName());
+        }
+
+        q = em.createQuery("select x from Deity x "
+            + "where x.father.name = 'Zeus'");
+
+        for (Deity m : (List<Deity>)q.getResultList()) {
+            System.out.println("Child of Zeus: " + m.getName());
+        }
+
+        q = em.createNamedQuery("siblings").
+            setParameter(1, em.getReference(Deity.class, "Rhea"));
+
+        for (Deity m : (List<Deity>)em.createNamedQuery("siblings").
+            setParameter(1, em.getReference(Deity.class, "Rhea")).
+            getResultList()) {
+            System.out.println("Siblings of Rhea: " + m.getName());
+        }
+
+        for (Deity m : (List<Deity>)em.createNamedQuery("half-siblings").
+            setParameter(1, em.getReference(Deity.class, "Apollo")).
+            getResultList()) {
+            System.out.println("Half-siblings of Apollo: " + m.getName());
+        }
+
+        for (Deity m : (List<Deity>)em.createNamedQuery("cousins").
+            setParameter(1, em.getReference(Deity.class, "Leto")).
+            getResultList()) {
+            System.out.println("Cousins of Leto: " + m.getName());
+        }
+    }
+}

Added: incubator/openjpa/trunk/openjpa-examples/src/main/java/relations/build.xml
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-examples/src/main/java/relations/build.xml?view=auto&rev=475498
==============================================================================
--- incubator/openjpa/trunk/openjpa-examples/src/main/java/relations/build.xml (added)
+++ incubator/openjpa/trunk/openjpa-examples/src/main/java/relations/build.xml Wed Nov 15 15:41:37 2006
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2006 The Apache Software Foundation.
+ 
+ Licensed 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.
+-->
+<project name="relations" default="run">
+    <property name="example" value="relations"/>
+    <import file="../build.xml"/>
+</project>

Modified: incubator/openjpa/trunk/openjpa-persistence-jdbc/pom.xml
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-persistence-jdbc/pom.xml?view=diff&rev=475498&r1=475497&r2=475498
==============================================================================
--- incubator/openjpa/trunk/openjpa-persistence-jdbc/pom.xml (original)
+++ incubator/openjpa/trunk/openjpa-persistence-jdbc/pom.xml Wed Nov 15 15:41:37 2006
@@ -45,7 +45,7 @@
         <dependency>
             <groupId>org.apache.derby</groupId>
             <artifactId>derby</artifactId>
-            <version>10.1.3.1</version>
+            <version>10.2.1.6</version>
             <scope>test</scope>
         </dependency>
         <dependency>

Modified: incubator/openjpa/trunk/openjpa-project/pom.xml
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-project/pom.xml?view=diff&rev=475498&r1=475497&r2=475498
==============================================================================
--- incubator/openjpa/trunk/openjpa-project/pom.xml (original)
+++ incubator/openjpa/trunk/openjpa-project/pom.xml Wed Nov 15 15:41:37 2006
@@ -343,7 +343,7 @@
         <dependency>
             <groupId>org.apache.derby</groupId>
             <artifactId>derby</artifactId>
-            <version>10.1.3.1</version>
+            <version>10.2.1.6</version>
         </dependency>
 
         <!-- jars needed for for docbook -->