Search code examples
mysqljpaeclipselink

Can EclipseLink create the database specified in persistence.xml?


I'm working through the exercises in Beginning Java EE 7 except I'm trying to adapt them to use MySQL instead of Derby. For the chapter 4 JPA exercise, I changed the persistence.xml to this:

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"
             version="2.1">

  <persistence-unit name="chapter04PU" transaction-type="RESOURCE_LOCAL">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <class>org.agoncal.book.javaee7.chapter04.Book</class>
    <properties>
      <property name="javax.persistence.schema-generation.database.action" value="drop-and-create"/>
      <property name="javax.persistence.schema-generation.scripts.action" value="drop-and-create"/>
      <property name="javax.persistence.schema-generation.scripts.create-target" value="chapter04Create.ddl"/>
      <property name="javax.persistence.schema-generation.scripts.drop-target" value="chapter04Drop.ddl"/>
      <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
      <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/chapter04DB"/>
      <property name="javax.persistence.jdbc.user" value="USER"/>
      <property name="javax.persistence.jdbc.password" value="PASS"/>
      <property name="javax.persistence.sql-load-script-source" value="insert.sql"/>
      <property name="eclipselink.logging.level" value="INFO"/>
      <property name="eclipselink.ddl-generation" value="create-or-extend-tables"/>
    </properties>
  </persistence-unit>

  <persistence-unit name="chapter04TestPU" transaction-type="RESOURCE_LOCAL">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <class>org.agoncal.book.javaee7.chapter04.Book</class>
    <properties>
      <property name="javax.persistence.schema-generation.database.action" value="drop-and-create"/>
      <property name="javax.persistence.schema-generation.scripts.action" value="drop-and-create"/>
      <property name="javax.persistence.schema-generation.scripts.create-target" value="create.sql"/>
      <property name="javax.persistence.schema-generation.scripts.drop-target" value="drop.sql"/>
      <property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.EmbeddedDriver"/>
      <property name="javax.persistence.jdbc.url" value="jdbc:derby:memory:chapter0`enter code here`4DB;create=true"/>
      <property name="javax.persistence.sql-load-script-source" value="insert.sql"/>
      <property name="eclipselink.logging.level" value="INFO"/>
    </properties>
  </persistence-unit>

</persistence>

Everything builds fine, and if I go to the db server and create the database, the jar runs fine. But I'm trying to get EclipseLink to create the db at runtime (as the book implies that Derby will do), and if the db doesn't exist when I run the jar I get this error:

Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown database 'chapter04DB'

How can I get EclipseLink to create a MySQL database at runtime?


Solution

  • You can't, because the automatic creation of a database is a Derby feature, instead of the automatic creation of the schema, which can be performed by EclipseLink using

    <property name="eclipselink.ddl-generation" value="create-or-extend-tables"/>