I have recently been playing with JPA, TopLink and Java DB (Apache Derby if you prefer) to manage date in Java SE applications. And I love those tools! It then dawned to me that I could make things even easier by using Groovy.
Unfortunately, TopLink doesn’t seem to play nice with Groovy as none of my persistent classes can be found by TopLink. I have tried to write the POJO in Groovy, write the POJO in Groovy and compile a .class and finally write the POJO in Java but nothing worked. TopLink keep sending me a ClassNotFoundException
at startup. TopLink finds the persistence.xml
file so it’s not the problem. Incidentally, all my Groovy code works just fine when compiled and ran with javac/java.
Does any of you every tried to use TopLink with Groovy? If so, I’d love to get some help. (And I don’t want to use Hibernate’s JPA implementation by the way :-)
Update: the source code of both Java and Groovy version is available. The Groovy version cannot find the Person
POJO no matter what I do (use a Groovy bean, compile the Groovy source to a .class, use a Java bean, use a Java bean in a JAR, etc.)
I would be more then happy to assist. Are you listing the class in the persistence unit definition in the persistence.xml?
I am not a Groovy expert but if you sent me your example I would happy to try it out and see if I can point you in the right direction.
Doug
Hi Doug! Thanks for offering your help. The class is indeed listed in the persistence.xml. In fact, this Groovy test is a port of a working Java test. I’ll send you both versions asap.
I have updated this blog entry with a pointer to the source.
Not a huge Grovy expert, but I’m fairly certain that Groovy lacks support for annotations so my guess is that’s why your persistence annotations are ignored.
I removed the Person tag and added a basic orm.xml in the META-INF directory. This is the content of my orm.xml:
Running the populate script did now work fine and there were 9 rows in the person table:
CONNECTION0* – jdbc:derby:groovy/address-book
* = current connection
ij> select count(*) as count from person;
COUNT
———–
9
Hope this helps,
Thomas
Looks like your blog softeware ate my xml – I’ll try again after escaping it. This is the orm.xml that I used:
<?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 class=”Person” metadata-complete=”true” access=”FIELD”>
<attributes>
<id name=”id”>
<generated-value strategy=”AUTO”/>
</id>
<basic name=”firstName”/>
<basic name=”lastName”/>
</attributes>
</entity>
</entity-mappings>
The orm.xml didn’t make it into the post – try this link to download it.
I wasn’t quite clear above – I had to remove the Person class reference from the peristence XML file to get it to work.
Not so sure it is the lack of annotation support that is the problem. Groovy 1.0 doesn’t work with the annotations but built a current snapshot of Groovy 1.0.1 and now the JPA annotations are picked up. I still need a minimal entry in orm.xml to get the class to be found – probably a classloading issue. If I use this
<entity class=”Person” name=”Person” metadata-complete=”false” access=”FIELD”>
</entity>
in orm.xml instead of referencing the class in persistence.xml everything works OK.
Thomas, thanks a lot! I was indeed using a snapshot of Groovy that does support annotations, which is not Groovy 1.0. What is orm.xml? How is it different from specifying entries in persistence.xml? I’ll use this until a fix is found in either Groovy and/or TopLink though. Thanks again!
Thomas, with your minimal version, I get another error. TopLink complains about not finding any @Id in the Person class.
Never mind, my bad. I messed up with Groovy’s snapshots. Everything is fine.
Romain, glad you got it to work. The orm.xml file is a way to externalize your configuration and override all or some of your annotations so they can be changed without having to recompile your code. This is of course a moot point when you are using Groovy :) You can have multiple orm.xml files and specify the names in the persistence.xml file. I have no idea why specifying the class in the orm.xml file works while specifying it in persistence.xml doesn’t. Hopefully someone from the TopLink project can shed some light here.
Hi Romain,
May I know why you don’t want to use hibernated with JPA?
Thanks
James,
Hibernate was too much of a pain to configure. Just figuring out what jars to put in my application drove me away. TopLink was a single jar. Besides, why Hibernate and not TopLink? :)
14xfmmbf9q6lpu94