As you might know with JPA, the META-INF/persistence.xml file defines a persistence unit with some provider’s properties. For example, if you are using JPA in a Java SE environment, you will have to define the JDBC driver, database connexion (user and password), database URL and so forth. In JPA 1.0 these properties were not standard, so for each persistence provider you would have to use proprietary properties. For example, with EclipseLink this is what you would need to connect to a Derby database :
[sourcecode language=”xml”]
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="1.0">
<persistence-unit name="chapter02PU" transaction-type="RESOURCE_LOCAL">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<class>com.apress.javaee6.chapter02.Book</class>
<properties>
<property name="eclipselink.target-database" value="DERBY"/>
<property name="eclipselink.ddl-generation" value="drop-and-create-tables"/>
<property name="eclipselink.jdbc.driver" value="org.apache.derby.jdbc.ClientDriver"/>
<property name="eclipselink.jdbc.url" value="jdbc:derby://localhost:1527/chapter02DB;create=true"/>
<property name="eclipselink.jdbc.user" value="APP"/>
<property name="eclipselink.jdbc.password" value="APP"/>
</properties>
</persistence-unit>
</persistence>
[/sourcecode]
As you can see, each property is called eclipselink.something. With the new JPA 2.0 shipping with Java EE 6 in September, some properties have been standardised :
- javax.persistence.jdbc.driver — fully qualified name of the driver class
- javax.persistence.jdbc.url — driver-specific URL
- javax.persistence.jdbc.user — username used by database connection
- javax.persistence.jdbc.password — password for database connection validation
If you use the latest build of EclipseLink (reference implementation of JPA 2.0) you will be able to use these properties as follow :
[sourcecode language=”xml”]
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="1.0">
<persistence-unit name="chapter02PU" transaction-type="RESOURCE_LOCAL">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<class>com.apress.javaee6.chapter02.Book</class>
<properties>
<property name="eclipselink.target-database" value="DERBY"/>
<property name="eclipselink.ddl-generation" value="drop-and-create-tables"/>
<property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.ClientDriver"/>
<property name="javax.persistence.jdbc.url" value="jdbc:derby://localhost:1527/chapter02DB;create=true"/>
<property name="javax.persistence.jdbc.user" value="APP"/>
<property name="javax.persistence.jdbc.password" value="APP"/>
</properties>
</persistence-unit>
</persistence>
[/sourcecode]
Except for the target-database and ddl-generation properties, the rest of the persistence.xml file is portable across implementations. Again, this is just an example showing how Java EE 6 is trying to make code as portable as possible. If you want to know more about it, check the JPA 2.0 specification.
I’m getting an access violation for derby.log when I try to run the test in chapter 2 of your Java EE 6 Book. I have checked and the directory and file are all r/w for everyone!
Mon Mar 21 18:25:31 EDT 2011 : Security manager installed using the Basic server security policy.
Mon Mar 21 18:25:31 EDT 2011 Thread[main,5,main] java.security.AccessControlException: access denied (java.io.FilePermission derby.log read)
Mon Mar 21 18:25:31 EDT 2011 : Apache Derby Network Server – 10.7.1.1 – (1040133) started and ready to accept connections on port 1527
Mon Mar 21 18:25:31 EDT 2011 : Apache Derby Network Server – 10.7.1.1 – (1040133) started and ready to accept connections on port 1527
Is there a way to add something to the persistence.xml to fix this or is the problem something else. The test succeeds but actually throws an exception and then says the table “BOOK” does not exist when it tries to DROP the table.
Nice article
Hi. I have a question about and
Why are they supposed to be assigned with value APP. I’m trying to figure out where the configuration for the user and password happens, but to no avail. Maybe it’s something really simple and I just over looked but I can’t find any information about it. Is this a default set up??
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
p.s. I’m not certain why you instantiate checker variable strongly in zipcodevalidator i.e.
@Inject
@USA
private ZipCodeChecker checker = new ZipCodeChecker();
Is this supposed to be this way. Doesn’t this introduce dependency.
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Regards
Inyeol
Also, I can’t thank you enough for writing this book. This is the only material that I’ve been able to comprehend and learn anything about JEE7(and up-to-date), and I’ve tried many different tutorials including the ones by Oracle.
Thank you so much!
Regards
Inyeol
eclipselink.target-database can be replaced by javax.persistence.target-database.