Monday, July 5, 2010

Toplink

In Eclipse Workshop 11g, just do a New Project / JPA and follow the wizard.
It's excellent and it builds all Java classes from DB Schema.

Here some info on how to handle entities in JPA:
http://www.oracle.com/technology/products/ias/toplink/jpa/howto/create-modify-delete.html



If you want to ose other tools (not recommended)

Download:
http://www.oracle.com/technology/products/ias/toplink/index.html

Tutorial standalone:
http://www.oracle.com/technology/products/ias/toplink/doc/11110/tutorial/intro/standalone/intro_tutorial.htm



Run Workbench :
C:\apps\toplink_111130_en\utils\workbench\workbench.cmd

Unfortunately Workbench is not JPA aware.

This http://download.oracle.com/docs/cd/E13224_01/wlw/docs103/guide/ormworkbench/conGeneratingEJB3Mappings.html#creating_mappings_from_schema will explain you how to generate the JPA annotated Java classes from an existing database schema.


This is a JDeveloper demo on JPA
http://www.oracle.com/technology/products/jdev/viewlets/1013/ejb_30_viewlet_swf.html

An interesting JPA plugin for Eclipse (99 USD)
http://objectgeneration.com/eclipse/index.html

EclipseLink gives you JPA in Eclipse
http://wiki.eclipse.org/EclipseLink



Now let's setup a standalone application; I am using a schema SCOTT with username SCOTT and password TIGER on my local machine

CREATE TABLE test_entity  (
    entity_id               NUMBER(10),
    entity_name             VARCHAR2(30),
    entity_description      VARCHAR2(50)
);



The JPA entity class:

package my.entity;

import java.io.Serializable;

import javax.persistence.Entity;
import javax.persistence.Table;
import javax.persistence.Column;
import javax.persistence.Id;

/** JPA Annotation linking DB table to Java Class. */
@Entity
@Table(name = "TEST_ENTITY", schema = "SCOTT")

public class TestEntity implements Serializable {

    /** The Constant serialVersionUID. */
    private static final long serialVersionUID = 1L;

    /** The testEntity id. */
    @Id
    @Column(name = "ENTITY_ID")
    private int entityId;

    /** The testEntity name. */
    @Column(name = "ENTITY_NAME")
    private String entityName;

    /** The testEntity description. */
    @Column(name = "ENTITY_DESCRIPTION")
    private String entityDescription;

    /**
     * Instantiates a new testEntity.
     */
    public TestEntity() {}

    /**
     * Setter for the testEntity variable.
     *
     * @param entityId - the new value
     */
    public void setTestEntityId(int entityId) {
        this.entityId = entityId;
    }

    /**
     * Getter for the testEntity variable.
     *
     * @return int
     */
    public int getEntityId() {
        return entityId;
    }

    /**
     * Setter for the entityName variable.
     *
     * @param entityName - the new value
     */
    public void setEntityName(String entityName) {
        this.entityName = entityName;
    }

    /**
     * Getter for entityName variable.
     *
     * @return String
     */
    public String getEntityName() {
        return entityName;
    }

    /**
     * Setter for entityDescription variable.
     *
     * @param entityDescription - the new value
     */
    public void setEntityDescription(String entityDescription) {
        this.entityDescription = entityDescription;
    }

    /**
     * Gettter for entityDescription variable.
     *
     * @return String
     */
    public String getEntityDescription() {
        return entityDescription;
    }

}




use these jars:
commons-logging-api.jar
commons-logging.jar
odbc14.jar
toplink-essentials.jar


the persistence.xml should be:


   
    oracle.toplink.essentials.PersistenceProvider
    jdbc/localXE
    my.entity.TestEntity
    
      
      
      
      
      
      
      
      
      
      
    
  



and this is the test client:


package my.entity;

import java.io.Serializable;

import java.util.HashMap;
import java.util.Map;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityNotFoundException;
import javax.persistence.Persistence;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;


public class TestEntityHandler implements Serializable {

    /** Default Serial Version UID. */
    private static final long serialVersionUID = 1L;

    /** The Default Class LOGGER. */
    private static final Log LOGGER = LogFactory.getFactory().getInstance(
            TestEntityHandler.class.getName());

    /** The entity manager factory. */
    private static EntityManagerFactory entityManagerFactory = null;

    /** The Entity Manager for JAXB container managed persistence. */
    protected EntityManager em = null;

    /** The testEntity. */
    private TestEntity testEntity = null;

    /**
     * Public constructor.
     */
    public TestEntityHandler() { testEntity = new TestEntity(); }

    /**
     * Initialise and return the JAXB EntityManager to be used by this Class instance.
     *
     * @return - a valid [initialised] EntityManager instance
     */
    private EntityManager initialiseEntityManager() {
        try {
            if (em == null) {
                em = getEntityManager();
                LOGGER.info("Initialised Entity Manager: " + em);
            }
        } catch (Exception e) {
            LOGGER.error("Failed to initialise EntityManager instance! ... " + e, e);
        }
        return em;
    }

    /**
     * Persist a new instance of the Entity.
     */
    public void create() {
        initialiseEntityManager();
        em.getTransaction().begin();
        em.persist(testEntity);
        em.getTransaction().commit();
        //em.close();
    }

    /**
     * Persist updated details of an existing instance of the Entity.
     */
    public void update() {
        initialiseEntityManager();
        em.getTransaction().begin();
        em.merge(testEntity);
        em.getTransaction().commit();
        // This next step should not be necessary; but sometimes update is not propagated !??
        em.getTransaction().begin();
        refreshEntity(testEntity);
        em.getTransaction().commit();
        //em.close();
    }

    /**
     * Delete an existing instance of the Entity from the system.
     */
    public void delete() {
        initialiseEntityManager();
        em.getTransaction().begin();
        em.remove(testEntity);
        em.getTransaction().commit();
        //em.close();
    }


    /**
     * Gets the testEntity.
     *
     * @return the testEntity
     */
    public TestEntity getTestEntity() {
        return testEntity;
    }

    /**
     * Sets the testEntity.
     *
     * @param testEntity_ the new testEntity
     */
    public void setTestEntity(TestEntity testEntity_) {
        this.testEntity = testEntity_;
    }

    // Everything below belongs in other Class(es), reproduced here for simplicity.

    /**
     * Gets the entity manager.
     *
     * @return the entity manager
     */
    private EntityManager getEntityManager () {
        try {
            if (entityManagerFactory == null) {
                LOGGER.info("Attempting to create EntityManger ... ");
                Map override = new HashMap();
                // Override the provider used for persistence
                override.put("provider", "oracle.toplink.essentials.PersistenceProvider");
                // This name must correspond to value in META-INF/persistence.xml
                entityManagerFactory = Persistence.createEntityManagerFactory("myPersistenceUnit");
            }

            EntityManager entityManager = null;
            entityManager = entityManagerFactory.createEntityManager();
            LOGGER.info("Returning EntityManger instance:= " + entityManager);
            return entityManager;
        } catch (Exception e) {
            LOGGER.error("Exception in PersistenceManager.getEntityManager: " + e, e);
        }
        return null;
    }

    /**
     * Refresh the entity from database.
     *
     * @param TestEntity - abstract class (substituted at runtime) that is to be refreshed
     */
    protected void refreshEntity(TestEntity testEntity) {
        try {
              em.refresh(testEntity);
            } catch(EntityNotFoundException ex){
              LOGGER.debug("Failed to refresh entity; this may not be a problem");
            }
    }

    /**
     * Close the EntityManager instance.
     */
    public void closeEM() {
        em.close();
    }

    public static void main(String args[]) {
        TestEntityHandler testEntityHandler = new TestEntityHandler();
        TestEntity testEntity = new TestEntity();
        testEntity.setTestEntityId(500);
        testEntity.setEntityName("PierreLuigi");
        testEntity.setEntityDescription("This is a test");
        testEntityHandler.setTestEntity(testEntity);
        testEntityHandler.create();
        LOGGER.info("Created new TestEntity; check database now ... ");

        try {
            Thread.sleep(10000);
            LOGGER.info("Resuming ... ");
        } catch(InterruptedException e) {
            e.printStackTrace();
        }

        // Before continuing check database to ensure that object was created.

        testEntity.setEntityName("PierreLuigi Vernetto");
        testEntityHandler.setTestEntity(testEntity);
        testEntityHandler.getTestEntity().setEntityDescription("This is a second test (UPDATE)");
        testEntityHandler.update();
        LOGGER.info("Updated new TestEntity; check database now ... ");

        try {
            Thread.sleep(10000);
            LOGGER.info("Resuming ... ");
        } catch(InterruptedException e) {
            e.printStackTrace();
        }


        // Before continuing check database to ensure that object was updated.

        testEntity.setEntityName("Pierluigi Vernetto is stupid");
        testEntity.setEntityDescription("This is a second test (UPDATE)");
        testEntityHandler.delete();
        LOGGER.info("Deleted new TestEntity.");

        testEntityHandler.closeEM();

        // Now check that the object was deleted.

    }
}




No comments: