Recent changes in the EJB 3.0 Persistence specification (that invalidated my code) html

Recent changes in the EJB 3.0 Persistence specification (that invalidated my code)

While preparing for a workshop on the EJB 3.0 Persistence API that I will present later today, I decided – against all the instructions in demo-school and presentation-college – to make a last minute change: replace the Glassfish libraries from build 20 (december 2005) with the new Glassfish stand-alone Persistence implementation (see: (that is 2 Mb instead of 80 or so). What I did not count on, is that since the build I used before, there have been several changes in the Annotations used for defining the Object Relational Mapping. As a result, my demos did not function anymore, and some of the labs were rendered incorrect.


Using the most recent EJB 3.0 Persistence Specification document I tried to correct, one by one, the errors my compilation as well as runtime execution ran into. Here a summary of the changes I had to make:

@ID – no longer has any attributes. No more generate and generator attributes

@GeneratedValue – the following method is now used for specifying the fact that the value for an attribute during insert into the database should be retrieved from a database sequence:

    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="ALS_PBR_SEQ")
    public Long getId() {
        return id;

We also need to import two classes:

import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;

@NamedQuery – the attribute queryString is now simply called query.

@JoinTable – the attribute table (of type @Table) is dropped. Now we simply use name to specify the name of the JoinTable. For example:

    @JoinTable(name = "als_authorships", joinColumns = {
           @JoinColumn(name = "atr_id")
       }, inverseJoinColumns = {
           @JoinColumn(name = "bok_id")

Then the persistence.xml underwent some changes:

We need to add the attribute version=”1.0″ to the persistence element:

<persistence xmlns="" version="1.0">

And the property-names were changed; instead of just jdbc.driver, jdbc.url etc., the standalone Glassfish Persistence implementation requires the property names to be prefixed with toplink.jdbc…. It does not seem likely that this change is a JSR-220 modification, it is more likely that this reflects an internal change in the Glassfish code.

  <property name="toplink.jdbc.driver" value="<database driver>"/>
  <property name="toplink.jdbc.url" value="<database url>"/>
  <property name="toplink.jdbc.user" value="<user>"/>
  <property name="toplink.jdbc.password" value="<password>"/>
  <property name="toplink.logging.level" value="INFO"/>


Since most of these changes seem improvements, I am not hugely disappointed. And I found about these just in time for my workshop.


Resources on how to get started with Glassfish Stand Alone persistence

Java Community Process on EJB 3.0 Persistence

Glassfish Reference Implementation of EJB 3.0 Persistence