As TOTD
#187 explained, one of the new features in JPA 2.1 is Schema
Generation. It refers to generation of database artifacts like
tables, indexes, and constraints in a database schema. Read TOTD
#187 for more details. This Tip Of TheDay (TOTD) will explain how to use this feature in GlassFish
4.
JPA 2.1 is implemented in EclipseLink and the status shows that a decent progress is made. EclipseLink Milestone builds shows the dates when milestones are released. It typically takes a few days for the milestone to be integrated in GlassFish 4 after the release.
How do you know which milestone is integrated in GlassFish 4 ?
Issue the following commmand in
I tried this with the latest nightly build (dated Jan 18). By the time you read this blog, a newer version may be integrated and so the version string may look different.
Now lets see this in action!
The sample code explained below can be downloaded here and run on GlassFish 4 1/17 nightly. A promoted build after this nightly should work too.
Create an Entity class as:
The associated
This will generate the table in the database defined by
After this, you can write a simple EJB as:
A different set of properties may be specified as:
By default, the scripts are generated in
As TOTD #187 explains, you can bundle DDL and DML scripts to generate and populate the database. Are you ready to test drive JPA 2.1 implemented using EclipseLink 2.5 in GlassFish 4 ?
JPA 2.1 Public Review specification has been available for a few days now. The Appendix A in the specification provide revision history in case you want to focus on the newly added features only. If you are a JUG member, you may consider adopting this JSR and provide feedback!
JPA 2.1 is implemented in EclipseLink and the status shows that a decent progress is made. EclipseLink Milestone builds shows the dates when milestones are released. It typically takes a few days for the milestone to be integrated in GlassFish 4 after the release.
How do you know which milestone is integrated in GlassFish 4 ?
Issue the following commmand in
glassfish/modules
directory:unzip -p org.eclipse.persistence.core.jar META-INF/MANIFEST.MF | grep Bundle-Versionto see an output as:
Bundle-Version: 2.5.0.v20130110-d839ca4If we break the version string then it shows this is version 2.5.0 and dated 20130110 in the format YYYYMMDD, that would be Jan 10, 2013. Based upon the milestone release dates, this indicates M6 is integrated.
I tried this with the latest nightly build (dated Jan 18). By the time you read this blog, a newer version may be integrated and so the version string may look different.
Now lets see this in action!
The sample code explained below can be downloaded here and run on GlassFish 4 1/17 nightly. A promoted build after this nightly should work too.
Create an Entity class as:
@EntityThis is a simple
@Table
@NamedQueries({
@NamedQuery(name = "Employee.findAll", query = "SELECT e FROM Employee e")
})
public class Employee implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
@Column(length=40)
private String name;
Employee
entity that has two fields id
and name
. A trivial @NamedQuery
is
defined to retrieve the list of employees.The associated
persistence.xml
looks like:<?xml version="1.0" encoding="UTF-8"?>Other than the usual elements like
<persistence version="2.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_2_0.xsd">
<persistence-unit name="MyPU" transaction-type="JTA">
<jta-data-source>jdbc/sample</jta-data-source>
<properties>
<property name="javax.persistence.schema-generation-action" value="drop-and-create"/>
<property name="javax.persistence.schema-generation-target" value="database"/>
<property name="eclipselink.deploy-on-startup" value="true"/>
</properties>
</persistence-unit>
</persistence>
<persistence-unit>
and <jta-data-source>
, the newly introduced
properties - javax.persistence.schema-generation-action
and javax.persistence.schema-generation-target
define
the action and target for the schema generation. The action is to
drop and create the tables. The target defines to perform the action
in the database. These properties control the behavior of schema
generation and their meaning is defined in TOTD
#187. Notice, the third property is EclipseLink specific and
is specified to eagerly initialize the Persistence Unit. This will
ensure that the schema is generated during the application
deployment itself. Otherwise it is generated when the PU is first
accessed.This will generate the table in the database defined by
jdbc/sample
JDBC resource. This resource is pre-defined for JavaDB that is
already bundled with GlassFish 4.After this, you can write a simple EJB as:
@StatelessAnd invoke it from a Servlet as:
public class EmployeeBean {
@PersistenceContext
EntityManager em;
public void persist(Employee e) {
em.persist(e);
}
public List<Employee> get() {
return em.createNamedQuery("Employee.findAll", Employee.class).getResultList();
}
}
for (int i=0; i<5; i++) {
bean.persist(new Employee("Name" + i));
}
for (Employee e : bean.get()) {
out.println(e.getName() + "<br>");
}
A different set of properties may be specified as:
<properties>These properties specify the
<property name="javax.persistence.schema-generation-action" value="drop-and-create"/>
<property name="javax.persistence.schema-generation-target" value="scripts"/>
<property name="javax.persistence.ddl-create-script-target" value="createfoo.sql"/>
<property name="javax.persistence.ddl-drop-script-target" value="dropfoo.sql"/>
<property name="eclipselink.deploy-on-startup" value="true"/>
<property name="eclipselink.application-location" value="/tmp"/>
</properties>
action
as"drop-and-create", i.e. drop and create the tables. The target
specifies the the action to be performed in a script. The *.script-target
property specifies the name of the files for create and drop DDL.
The following scripts are generated:more /tmp/createfoo.sql
CREATE TABLE EMPLOYEE (ID INTEGER NOT NULL, NAME VARCHAR(40), PRIMARY KEY (ID))
CREATE TABLE SEQUENCE (SEQ_NAME VARCHAR(50) NOT NULL, SEQ_COUNT DECIMAL(15), PRIMARY KEY (SEQ_NAME))
INSERT INTO SEQUENCE(SEQ_NAME, SEQ_COUNT) values ('SEQ_GEN', 0)
CREATE TABLE SEQUENCE (SEQ_NAME VARCHAR(50) NOT NULL, SEQ_COUNT DECIMAL(15), PRIMARY KEY (SEQ_NAME))
INSERT INTO SEQUENCE(SEQ_NAME, SEQ_COUNT) values ('SEQ_GEN', 0)
more /tmp/dropfoo.sql
DROP TABLE EMPLOYEE
DELETE FROM SEQUENCE WHERE SEQ_NAME = 'SEQ_GEN'
By default, the scripts are generated in
glassfish/domains/domain1
directory. In this case, an EclipseLink-specific property to
identify the base location of the generated files is specified.As TOTD #187 explains, you can bundle DDL and DML scripts to generate and populate the database. Are you ready to test drive JPA 2.1 implemented using EclipseLink 2.5 in GlassFish 4 ?
JPA 2.1 Public Review specification has been available for a few days now. The Appendix A in the specification provide revision history in case you want to focus on the newly added features only. If you are a JUG member, you may consider adopting this JSR and provide feedback!