openjpa-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Craig L Russell <Craig.Russ...@Sun.COM>
Subject Re: Runtime Enhancement in Eclipse
Date Fri, 13 Jul 2007 20:30:35 GMT
It does sound like the Europa could use an update to avoid generating  
BigDecimal.

By the way, BigInteger does not have the same issue w.r.t. equals vs.  
compareTo that BigDecimal has. The only issue that I know of with  
BigInteger is its nullability, which means it's an inexact mapping to  
primary key columns that must be non-null.

If you're mapping from a primary key column with a size less than 9  
I'd definitely want to have it mapped to long.

Craig

On Jul 13, 2007, at 9:28 AM, Thierry Lach wrote:

> In light of the comments about BigDecimal inconsistencies, I think I'd
> consider that to be a flaw in the JPA Eclipse Plugin.
>
> On 7/12/07, Janap <janapureddy@gmail.com> wrote:
>>
>>
>> HI Craig,
>>
>> Thank you for the tip. But its surprising that when I generate Entity
>> classes using the JPA Eclipse Plugin(from Europa) the default type it
>> assigns is BigDecimal.  Changing for one class is no problem but
>> when I generate classes for a complete database , it might require  
>> some
>> refactoring I believe.
>>
>> Jan
>>
>>
>> Craig L Russell wrote:
>> >
>> > Hi Janap,
>> >
>> > I'd recommend you stay far away from BigDecimal fields for primary
>> > keys, even if your provider supports them.
>> >
>> > The BigDecimal class has a strange notion of equality that makes it
>> > unsuitable for primary keys. That is, given BigDecimal instances A
>> > and B, the following can be true:
>> >
>> > (0 == A .compareTo B) true
>> > (A .equals B) false
>> >
>> > This means that using BigDecimal instances as keys in Maps is
>> > impossible. Well, really hard.
>> >
>> > The JPA spec requires support for float and double types but  
>> strongly
>> > discourages their use. BigDecimal isn't even required due to these
>> > problems.
>> >
>> > Craig
>> >
>> > On Jul 12, 2007, at 9:56 AM, Janap wrote:
>> >
>> >>
>> >> Whoa....Enhancement works finally. I gave up the javaagent,fiddled
>> >> around
>> >> with the Enhancer Task which all said the same thing .....
>> >>
>> >>  [openjpac] 141  INFO   [main] openjpa.MetaData - Found 1  
>> classes with
>> >> metadata in 0 milliseconds.
>> >>  [openjpac] 141  INFO   [main] openjpa.MetaData - The class
>> >> "test.Scale"
>> >> listed in the openjpa.MetaDataFactory configuration property could
>> >> not be
>> >> loaded; ignoring.
>> >>
>> >> i compiled it with the PCEnhancer java class. In Eclipse it is  
>> just
>> >> a click
>> >> away.
>> >>
>> >> One more observation - I now am using the JPA Eclipse Plugin to
>> >> generate
>> >> Entity classes and then enhance them. During this process, the
>> >> enhancer once
>> >> complained that I cannot use "BigDecimal" as primary key.
>> >> The enhancement worked after I converted it to "long". Any ideas?
>> >>
>> >>
>> >>
>> >>
>> >>
>> >> Janap wrote:
>> >>>
>> >>> I have tried both the combinations Marc. I believe it might be a
>> >>> problem
>> >>> with my class. I have to post the source tomorrow since I dont
>> >>> carry my
>> >>> work to home :-) The classes are entity classes which I have  
>> reverse
>> >>> engineered using the Hibernate Tools plugin for Eclipse. They are
>> >>> EJB 3.0
>> >>> compatible and work fine with hibernate.
>> >>>
>> >>> I appreciate the help,
>> >>> best wishes and good night
>> >>> Jan
>> >>>
>> >>>
>> >>> Patrick Linskey-2 wrote:
>> >>>>
>> >>>> Can you post the source to the Scale class?
>> >>>>
>> >>>> -Patrick
>> >>>>
>> >>>> On 7/11/07, Janap <janapureddy@gmail.com> wrote:
>> >>>>>
>> >>>>> Thx for the info Craig...got that step working. Didnt have 

>> time for
>> >>>>> research
>> >>>>> for the past2 days,but now Im back with another problem.
>> >>>>>
>> >>>>> My web project structure is as follows..
>> >>>>>
>> >>>>> /build/classes/test/Scale.class
>> >>>>>
>> >>>>> /src/test/Scale.java
>> >>>>>
>> >>>>> /web/WEB-INF/classes/META-INF/persistence.xml
>> >>>>> /web/WEB-INF/classes/META-INF/orm.xml
>> >>>>>
>> >>>>> /web/WEB-INF/lib
>> >>>>>
>> >>>>> Following is my persistence.xml
>> >>>>>
>> >>>>> <persistence xmlns="http://java.sun.com/xml/ns/persistence"
>> >>>>> version="1.0">
>> >>>>> <persistence-unit name="myPersistence"
>> >>>>> transaction-type="RESOURCE_LOCAL">
>> >>>>>         <provider>
>> >>>>>              
>> org.apache.openjpa.persistence.PersistenceProviderImpl
>> >>>>>         </provider>
>> >>>>>         <mapping-file>orm.xml</mapping-file>
>> >>>>>         <class>test.Scale</class>
>> >>>>>         <properties>
>> >>>>>             <property name="openjpa.ConnectionURL"  
>> value="myurl"/>
>> >>>>>             <property name="openjpa.ConnectionDriverName"
>> >>>>> value="oracle.jdbc.driver.OracleDriver"/>
>> >>>>>             <property name="openjpa.ConnectionUserName"
>> >>>>> value="myuser"/>
>> >>>>>             <property name="openjpa.ConnectionPassword"
>> >>>>> value="mypwd"/>
>> >>>>>             <property name="openjpa.Log"
>> >>>>> value="DefaultLevel=TRACE,Tool=TRACE"/>
>> >>>>>         </properties>
>> >>>>> </persistence-unit>
>> >>>>> </persistence>
>> >>>>>
>> >>>>>
>> >>>>>
>> >>>>> For runtime enhancement is start Tomcat within Eclipse with
the
>> >>>>> following VM
>> >>>>> arguments :
>> >>>>>
>> >>>>> -javaagent:C:\Programme\Eclipse\workspace\JPAWebTest\web\WEB-

>> INF
>> >>>>> \lib\openjpa-all-0.9.6- 
>> incubating.jar=addDefaultConstructor=false
>> >>>>> ,properties=C:\Programme\Eclipse\workspace\JPAWebTest\web 
>> \WEB-INF
>> >>>>> \classes\META-INF\persistence.xml,-scanDevPath=true,
>> >>>>> directory=C:\Programme\Eclipse\workspace\JPAWebTest\build
>> >>>>> \classes,-tmpClassLoader=false
>> >>>>>
>> >>>>>
>> >>>>> My Tomcat starts properly with the following log :
>> >>>>>
>> >>>>> 15  TRACE  [main] openjpa.Runtime - Setting the following
>> >>>>> properties
>> >>>>> from
>> >>>>> "file:/C:/Programme/Eclipse/workspace/JPAWebTest/web/WEB-INF/
>> >>>>> classes/META-INF/persistence.xml"
>> >>>>> into configuration: {openjpa.ConnectionUserName=myuser,
>> >>>>> openjpa.ConnectionPassword=mypwd,
>> >>>>> openjpa.Log=DefaultLevel=TRACE,Tool=TRACE,
>> >>>>> openjpa.MetaDataFactory=Resources=orm.xml, Types=test.Scale,
>> >>>>>  
>> javax.persistence.provider=org.apache.openjpa.persistence.Persisten
>> >>>>> ceProviderImpl,
>> >>>>> openjpa.ConnectionURL=myurl,
>> >>>>> openjpa.ConnectionDriverName=oracle.jdbc.driver.OracleDriver}
>> >>>>> 186  INFO   [main] openjpa.MetaData - Found 1 classes with
>> >>>>> metadata in 0
>> >>>>> milliseconds.
>> >>>>>
>> >>>>>
>> >>>>> Then as I try to run this servlet code :
>> >>>>>
>> >>>>>         EntityManagerFactory emf =
>> >>>>> Persistence.createEntityManagerFactory("myPersistence");
>> >>>>>
>> >>>>>         EntityManager em = emf.createEntityManager();
>> >>>>>         em.getTransaction().begin();
>> >>>>>
>> >>>>>         Scale tab = new Scale(5);
>> >>>>>         em.persist(tab);
>> >>>>>         em.getTransaction().commit();
>> >>>>>         em.close();
>> >>>>>         emf.close();
>> >>>>>
>> >>>>> I run into an exception which I believe because my class is
not
>> >>>>> somehow
>> >>>>> enhanced :
>> >>>>>
>> >>>>> 62  TRACE  [http-8090-Processor24] openjpa.MetaData - Using
>> >>>>> metadata
>> >>>>> factory
>> >>>>>  
>> "org.apache.openjpa.persistence.jdbc.PersistenceMappingFactory@1b0b
>> >>>>> dc8".
>> >>>>> 93  INFO   [http-8090-Processor24] openjpa.jdbc.JDBC - Using
>> >>>>> dictionary
>> >>>>> class "org.apache.openjpa.jdbc.sql.OracleDictionary".
>> >>>>> 202  INFO   [http-8090-Processor24] openjpa.MetaData - Found
1
>> >>>>> classes
>> >>>>> with
>> >>>>> metadata in 16 milliseconds.
>> >>>>> 95452  TRACE  [http-8090-Processor24] openjpa.Enhance - "test/
>> >>>>> Scale"
>> >>>>> requires runtime enhancement: true
>> >>>>> 95561  WARN   [http-8090-Processor24] openjpa.Enhance - An
>> >>>>> exception was
>> >>>>> thrown while attempting to perform class file transformation
on
>> >>>>> "test/Scale":
>> >>>>> java.lang.IllegalArgumentException:
>> >>>>> java.lang.ClassNotFoundException:
>> >>>>> test.Scale
>> >>>>>         at serp.util.Strings.toClass(Strings.java:211)
>> >>>>>         at serp.util.Strings.toClass(Strings.java:140)
>> >>>>>         at serp.bytecode.BCClass.getType(BCClass.java:565)
>> >>>>>         at
>> >>>>> org.apache.openjpa.enhance.PCEnhancer.<init>(PCEnhancer.java:

>> 187)
>> >>>>>         at
>> >>>>> org.apache.openjpa.enhance.PCClassFileTransformer.transform
>> >>>>> (PCClassFileTransformer.java:124)
>> >>>>>         at
>> >>>>> sun.instrument.TransformerManager.transform
>> >>>>> (TransformerManager.java:122)
>> >>>>>         at
>> >>>>> sun.instrument.InstrumentationImpl.transform
>> >>>>> (InstrumentationImpl.java:155)
>> >>>>>         at java.lang.ClassLoader.defineClass1(Native Method)
>> >>>>>         at java.lang.ClassLoader.defineClass 
>> (ClassLoader.java:620)
>> >>>>>
>> >>>>>
>> >>>>> I tried out different combinations but was not
>> >>>>> successful...probably
>> >>>>> someone
>> >>>>> could find the flaw..
>> >>>>>
>> >>>>> best wishes
>> >>>>> Jan
>> >>>>>
>> >>>>>
>> >>>>>
>> >>>>> Hi,
>> >>>>>
>> >>>>> This is from the Java SE 6 documentation. It explains "all":
>> >>>>> Command-Line Interface
>> >>>>>
>> >>>>> On implementations with a command-line interface, an agent is
>> >>>>> started
>> >>>>> by adding this option to the command-line:
>> >>>>>
>> >>>>> -javaagent:jarpath[=options]
>> >>>>> jarpath is the path to the agent JAR file. options is the agent
>> >>>>> options. This switch may be used multiple times on the same
>> >>>>> command-
>> >>>>> line, thus creating multiple agents. More than one agent may
 
>> use
>> >>>>> the
>> >>>>> same jarpath. An agent JAR file must conform to the JAR file
>> >>>>> specification.
>> >>>>> The manifest of the agent JAR file must contain the attribute
>> >>>>> Premain-
>> >>>>> Class. The value of this attribute is the name of the agent
 
>> class.
>> >>>>> The agent class must implement a public static premain method
>> >>>>> similar
>> >>>>> in principle to the main application entry point. After the
 
>> Java
>> >>>>> Virtual Machine (JVM) has initialized, each premain method 

>> will be
>> >>>>> called in the order the agents were specified, then the real
>> >>>>> application main method will be called. Each premain method
 
>> must
>> >>>>> return in order for the startup sequence to proceed.
>> >>>>> The premain method has one of two possible signatures. The JVM
>> >>>>> first
>> >>>>> attempts to invoke the following method on the agent class:
>> >>>>> public static void premain(String agentArgs, Instrumentation
 
>> inst);
>> >>>>> If the agent class does not implement this method then the 

>> JVM will
>> >>>>> attempt to invoke:
>> >>>>>
>> >>>>> public static void premain(String agentArgs);
>> >>>>> The agent class may also have an agentmain method for use  
>> when the
>> >>>>> agent is started after VM startup. When the agent is started
>> >>>>> using a
>> >>>>> command-line option, the agentmain method is not invoked.
>> >>>>>
>> >>>>> The agent class will be loaded by the system class loader (see
>> >>>>> ClassLoader.getSystemClassLoader). This is the class loader
 
>> which
>> >>>>> typically loads the class containing the application main
>> >>>>> method. The
>> >>>>> premain methods will be run under the same security and  
>> classloader
>> >>>>> rules as the application main method. There are no modeling
>> >>>>> restrictions on what the agent premain method may do. Anything
>> >>>>> application main can do, including creating threads, is  
>> legal from
>> >>>>> premain.
>> >>>>>
>> >>>>> Each agent is passed its agent options via the agentArgs  
>> parameter.
>> >>>>> The agent options are passed as a single string, any additional
>> >>>>> parsing should be performed by the agent itself.
>> >>>>>
>> >>>>> If the agent cannot be resolved (for example, because the agent
>> >>>>> class
>> >>>>> cannot be loaded, or because the agent class does not have an
>> >>>>> appropriate premain method), the JVM will abort. If a premain
>> >>>>> method
>> >>>>> throws an uncaught exception, the JVM will abort.
>> >>>>>
>> >>>>>
>> >>>>>
>> >>>>> Craig
>> >>>>>
>> >>>>>
>> >>>>>
>> >>>>> --
>> >>>>> View this message in context:
>> >>>>> http://www.nabble.com/Runtime-Enhancement-in-Eclipse-
>> >>>>> tf4049770.html#a11537016
>> >>>>> Sent from the OpenJPA Users mailing list archive at Nabble.com.
>> >>>>>
>> >>>>>
>> >>>>
>> >>>>
>> >>>> --
>> >>>> Patrick Linskey
>> >>>> 202 669 5907
>> >>>>
>> >>>>
>> >>>
>> >>>
>> >>
>> >> --
>> >> View this message in context: http://www.nabble.com/Runtime-
>> >> Enhancement-in-Eclipse-tf4049770.html#a11564182
>> >> Sent from the OpenJPA Users mailing list archive at Nabble.com.
>> >>
>> >
>> > Craig Russell
>> > Architect, Sun Java Enterprise System http://java.sun.com/ 
>> products/jdo
>> > 408 276-5638 mailto:Craig.Russell@sun.com
>> > P.S. A good JDO? O, Gasp!
>> >
>> >
>> >
>> >
>>
>> --
>> View this message in context:
>> http://www.nabble.com/Runtime-Enhancement-in-Eclipse- 
>> tf4049770.html#a11565895
>> Sent from the OpenJPA Users mailing list archive at Nabble.com.
>>
>>

Craig Russell
Architect, Sun Java Enterprise System http://java.sun.com/products/jdo
408 276-5638 mailto:Craig.Russell@sun.com
P.S. A good JDO? O, Gasp!


Mime
View raw message