openjpa-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Donald Woods <dwo...@apache.org>
Subject Re: Questions about OpenJPA issues
Date Mon, 15 Jun 2009 12:55:20 GMT
No, enhancing entities is another build step -
   http://openjpa.apache.org/entity-enhancement.html


-Donald


Benjamin S Vera-Tudela wrote:
> I have not tried that but was thinking on doing this. Is that what you 
> mean by preenhancing? How do I preenhance entities otherwise?
> 
> 
> 
> -----------------
> Sent from my BlackBerry Handheld.
> 
> 
> ----- Original Message -----
> From: Donald Woods [dwoods@apache.org]
> Sent: 06/15/2009 08:40 AM AST
> To: dev@openjpa.apache.org
> Subject: Re: Questions about OpenJPA issues
> 
> 
> 
> What happens if you add the length to the String fields?
>     @Basic
>     @Column(length = 8)
>     private String code;
> 
> Did you pre-enhance the entities?
> 
> 
> -Donald
> 
> 
> Benjamin S Vera-Tudela wrote:
>> Craig,
>>
>> The reason I use the SessionBean is exactly for what you mention. That 
>> is, I don't want to write the transaction begin/commit within 
>> try/catch/finally as I like to think that session beans are used to 
>> encapsulate my business logic within transaction boundaries. Is this 
>> approach correct?
>>
>> Please note that I get the "openjpa.jdbc.Schema - Existing column 
>> "CODE" on table "APP.PROMOTION" is incompatible with the same column 
>> in the given schema definition" error message for pretty much every 
>> field in my tables (entities). I just pasted one of them in my 
>> previous note to keep the message short.
>>
>> My orm.xml file is pretty much empty:
>>
>> <?xml version="1.0" encoding="UTF-8"?>
>> <entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm" 
>> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
>> xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm 
>> http://java.sun.com/xml/ns/persistence/orm_1_0.xsd" version="1.0">
>> </entity-mappings>
>>
>> My persistence.xml file is as follows (I've tried switching from 
>> transaction-type={JTA | RESOURCE_LOCAL} but from reading some 
>> articles, it sounds like I should be using the latter option, is this 
>> correct?)
>>
>> <?xml version="1.0" encoding="UTF-8"?>
>> <persistence version="1.0" 
>> xmlns="http://java.sun.com/xml/ns/persistence" 
>> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
>> xsi:schemaLocation="http://java.sun.com/xml/ns/persistence 
>> http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
>> <persistence-unit name="MyDataAppJPA" transaction-type="RESOURCE_LOCAL">
>> <jta-data-source>MyDataAppSource</jta-data-source>
>> <non-jta-data-source>MyDataAppNoTxSource</non-jta-data-source>
>>
>> <class>com.data.jpa.Account</class>
>> <class>com.data.jpa.AccountCustomer</class>
>> <class>com.data.jpa.Address</class>
>> <class>com.data.jpa.Promotion</class>
>> <!-- exclude-unlisted-classes>true</exclude-unlisted-classes -->
>>
>> <properties>
>> <property name="openjpa.ConnectionDriverName" 
>> value="org.apache.derby.jdbc.EmbeddedDriver"/>
>> <property name="openjpa.ConnectionURL" 
>> value="jdbc:derby://localhost:1527/testdb"/>
>> <!-- property name="openjpa.TransactionMode" value="managed"/ -->
>> <property name="openjpa.ConnectionFactoryMode" value="managed"/>
>> <property name="openjpa.jdbc.DBDictionary" value="derby"/>
>> <property name="openjpa.jdbc.DBDictionary" 
>> value="org.apache.openjpa.jdbc.sql.DerbyDictionary"/>
>> <property name="openjpa.jdbc.Schema" value="APP"/>
>> <property name="openjpa.jdbc.SynchronizeMappings" 
>> value="buildSchema(SchemaAction='add',ForeignKeys=true)"/>
>> <!-- property name="openjpa.jdbc.SynchronizeMappings" 
>> value="buildSchema(ForeignKeys=false)"/ -->
>> <property name="openjpa.Sequence" value="table(Table=OPENJPASEQ, 
>> Increment=100)"/>
>> <!-- property name="openjpa.Log" value="DefaultLevel=TRACE"/ -->
>> </properties>
>> </persistence-unit>
>> </persistence>
>>
>> Here is my SQL table definition:
>>
>> CREATE TABLE Promotion (
>> product_id INTEGER NOT NULL,
>> start_date DATE NOT NULL,
>> end_date DATE NOT NULL,
>> code CHAR(8),
>> discount SMALLINT NOT NULL,
>> message VARCHAR(1024),
>> broadcast CHAR(5)
>> );
>>
>> Here is the Promotion class:
>>
>> package com.data.jpa;
>>
>> import java.io.Serializable;
>> import java.sql.Date;
>>
>> import javax.persistence.Column;
>> import javax.persistence.Entity;
>> import javax.persistence.Id;
>> import javax.persistence.IdClass;
>>
>> @Entity
>> @IdClass(PromotionPK.class)
>> public class Promotion implements Serializable {
>> @Id
>> @Column(name="PRODUCT_ID", insertable=false, updatable=false)
>> private int productId;
>>
>> @Id
>> @Column(name="START_DATE")
>> private Date startDate;
>>
>> @Id
>> @Column(name="END_DATE")
>> private Date endDate;
>>
>> private String code;
>> private short discount;
>> private String message;
>> private String broadcast;
>>
>> private static final long serialVersionUID = 1L;
>>
>> public Promotion() {
>> super();
>> }
>>
>> // getters and setters follow
>> }
>>
>>
>> Benjamin S. Vera-Tudela
>> SWG Middleware Strategy
>> Ph: (512)-286-9073 T/L 363-9073
>> E-Mail: bveratudela@us.ibm.com
>>
>> Inactive hide details for Craig L Russell ---06/12/2009 05:11:56 
>> PM---Hi Benjamin, If you access OpenJPA from your servlet direCraig L 
>> Russell ---06/12/2009 05:11:56 PM---Hi Benjamin, If you access OpenJPA 
>> from your servlet directly, then you use the EntityTransaction to 
>> begin and commit transacti
>>
>>
>> From:   
>> Craig L Russell <Craig.Russell@Sun.COM>
>>
>> To:   
>> dev@openjpa.apache.org
>>
>> Date:   
>> 06/12/2009 05:11 PM
>>
>> Subject:   
>> Re: Questions about OpenJPA issues
>>
>> ------------------------------------------------------------------------
>>
>>
>>
>> Hi Benjamin,
>>
>> If you access OpenJPA from your servlet directly, then you use the 
>> EntityTransaction to begin and commit transactions. But if you 
>> delegate to a SessionBean, the bean's transaction properties begin and 
>> commit transactions without your writing any code.
>>
>> With regard to the schema mismatch, without seeing the orm metadata 
>> and the table definition it's hard to figure out where the problem is. 
>> The apache servers remove attachments from emails. Can you try pasting 
>> the text of the orm definition and the class definition for the 
>> Promotion class into the message?
>>
>> Regards,
>>
>> Craig
>>
>> On Jun 11, 2009, at 3:06 PM, Benjamin S Vera-Tudela wrote:
>>
>>             I am new to JPA and am having a problem with WAS CE 2.1.1.2
>>             (based on Geronimo) and after two days of researching, I am
>>             unable to identify the issue. Perhaps someone may know what
>>             the problem is by the info provided below. I have included
>>             my persistence.xml and deployment plan files in case someone
>>             wants to take a peek at these.
>>
>>             For background, my app is a simple J2EE app with accounts,
>>             products, and promotions among other related objects. After
>>             successful deployment on WAS CE 2.1.1.2, I can access the
>>             main JSPs and servlet, but upon posting data that is used to
>>             update the JPA entities via a Stateless Session Bean (SSB)
>>             invoked from the servlet, I get the several instances of the
>>             following message for various entity fields:
>>
>>             672 MyDataAppJPA WARN [http-0.0.0.0-8080-1]
>>             openjpa.jdbc.Schema - Existing column "CODE" on table
>>             "APP.PROMOTION" is incompatible with the same column in the
>>             given schema definition. Existing column:
>>             Full Name: PROMOTION.CODE
>>             Type: char
>>             Size: 8
>>             Default: null
>>             Not Null: false
>>             Given column:
>>             Full Name: Promotion.code
>>             Type: varchar
>>             Size: 255
>>             Default: null
>>             Not Null: false
>>
>>             These are followed by the exception:
>>
>>             <openjpa-1.2.1-r2180:4612 nonfatal user error>
>>             org.apache.openjpa.persistence.InvalidStateException: You
>>             cannot access the EntityTransaction when using managed
>>             transactions.
>>
>>             Any idea what may be causing these errors? Any hints are
>>             appreciated.
>>
>>             
>> ========================================================================================================================================

>>
>>
>>             For some further background on the app and how the pieces
>>             interact, the app contains:
>>
>>             1) A Web component with a Servlet and JSPs acting as the web
>>             front that interface with the end user
>>             2) An EJB component with a Stateless Session Bean (SSB) used
>>             to handle the transaction boundaries for "complex" business
>>             logic using the JPA entitites
>>             3) A JPA component containing all the Entity Beans for my
>>             application and "Entity Managers" generated with RAD (see
>>             below for an example)
>>
>>             My servlet instantiates the SSB and Entity Manager as 
>> follows:
>>
>>             <graycol.gif>Servlet Code:
>>             public class MyDataAppServlet extends HttpServlet {
>>             private static final long serialVersionUID = 1L;
>>
>>             @EJB
>>             private MyDataAppBeanLocal bean; // Stateless Session Bean
>>             reference
>>             private AccountManager accountMgr = new AccountManager(); //
>>             Entity Manager for the Account JPA entity
>>
>>             ...
>>             }
>>
>>
>>             A piece of my SSB code follows:
>>
>>             <graycol.gif>SSB Code:
>>             @Stateless
>>             public class MyDataAppBeanImpl implements 
>> MyDataAppBeanLocal {
>>             static java.util.Random rnd = new
>>             java.util.Random(System.currentTimeMillis());
>>
>>             @PersistenceContext(unitName="MyDataAppJPA")
>>             protected EntityManager em;
>>
>>             @Resource SessionContext ctx;
>>
>>             public void createAccount(String id, String password, String
>>             name, String type String address1, String address2, String
>>             city, String state, String zipCode)
>>             throws Exception {
>>             System.out.println(">>>> Creating account transaction");
>>             Account account = new Account();
>>             account.setLoginId(id);
>>             account.setPassword(password);
>>             account.setName(name);
>>             account.setType(type);
>>
>>             Address address = new Address();
>>             address.setAddress1(address1);
>>             address.setAddress2(address2);
>>             address.setCity(city);
>>             address.setState(state);
>>             address.setZipCode(zipCode);
>>
>>             account.setAddress(address);
>>
>>             em.persist(address);
>>             em.persist(account);
>>             }
>>
>>             My servlet may also perform simple updates on JPA entity
>>             fields using the object's "entity manager" (which I actually
>>             created using RAD tooling as I was learning JPA). For
>>             instance, from the sample servlet code above, the accountMgr
>>             can be used on an Account JPA entity to persist a simple
>>             field update such as the account's last login timestamp:
>>
>>             <graycol.gif>Updating JPA with Entity Manager:
>>             try {
>>             account.setLastLogin(new 
>> Timestamp(System.currentTimeMillis()));
>>             accountMgr.updateAccount(account);
>>             } ....
>>
>>
>>             The AccountManager looks like this (I have commented out
>>             annotations generated from RAD that are tied to WAS and not
>>             available in WAS CE such as @JPAManager and @Action):
>>
>>             <graycol.gif>Account Manager created with RAD:
>>             //XXX:@JPAManager(targetEntity=com.data.jpa.Account.class)
>>             @SuppressWarnings("unchecked")
>>             public class AccountManager {
>>
>>             private EntityManager getEntityManager() {
>>             EntityManagerFactory emf = Persistence
>>             .createEntityManagerFactory("MyDataAppJPA");
>>             return emf.createEntityManager();
>>             }
>>
>>             //XXX:@Action(Action.ACTION_TYPE.UPDATE)
>>             public String updateAccount(Account account) throws 
>> Exception {
>>             EntityManager em = getEntityManager();
>>             try {
>>             em.getTransaction().begin();
>>             account = em.merge(account);
>>             em.getTransaction().commit();
>>             } catch (Exception ex) {
>>             try {
>>             if (em.getTransaction().isActive()) {
>>             em.getTransaction().rollback();
>>             }
>>             } catch (Exception e) {
>>             ex.printStackTrace();
>>             throw e;
>>             }
>>             throw ex;
>>             } finally {
>>             em.close();
>>             }
>>             return "";
>>             }
>>             }
>>
>>             And finally here is persistence.xml and deployment plan for
>>             my JPA and app.
>>             /
>>             (See attached file: persistence.xml)(See attached file:
>>             MyDataApp.xml)/
>>
>>
>>
>>             Benjamin S. Vera-Tudela
>>             SWG Middleware Strategy
>>             Ph: (512)-286-9073 T/L 363-9073
>>             E-Mail: _bveratudela@us.ibm.com_ 
>> <mailto:bveratudela@us.ibm.com> 
>>
>> Craig L Russell
>> Architect, Sun Java Enterprise System _http://db.apache.org/jdo_
>> 408 276-5638 _mailto:Craig.Russell@sun.com_
>> P.S. A good JDO? O, Gasp!
>>
> 

Mime
View raw message