Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [eclipselink-users] How can I generate tables from entities?

From 20090609:1027 parallel thread
----------------------------------------------------------------------------------------------
Gerhard,

1) For your first issue where there are deprecation warnings, check the following - are you using 2 or more persistence units in your persistence.xml? I have 2 persistence units in my persistence.xml - I changed all 2 x 4 = 8 properties to get rid of warnings during preprocessing of both persistence units.
- otherwise verify that your orm.xml is not overriding properties.

For example...
http://wiki.eclipse.org/EclipseLink/Examples/JPA/Tomcat_Web_Tutorial#Direct_connection_.28RESOURCE_LOCAL.29_Persistence.xml

>Before:
<property name="eclipselink.jdbc.driver" value="oracle.jdbc.driver.OracleDriver"/> <property name="eclipselink.jdbc.url" value="jdbc:oracle:thin:@127.0.0.1:1521:orcl"/>
           <property name="eclipselink.jdbc.user" value="user"/>
           <property name="eclipselink.jdbc.password" value="pw"/>

>generates
[EL Info]: 2009-06-09 09:23:48.156--ServerSession(18680399)--Thread(Thread[main,5,main])--property eclipselink.jdbc.user is deprecated, property javax.persistence.jdbc.user should be used instead. [EL Info]: 2009-06-09 09:23:48.156--ServerSession(18680399)--Thread(Thread[main,5,main])--property eclipselink.jdbc.driver is deprecated, property javax.persistence.jdbc.driver should be used instead. [EL Info]: 2009-06-09 09:23:48.156--ServerSession(18680399)--Thread(Thread[main,5,main])--property eclipselink.jdbc.url is deprecated, property javax.persistence.jdbc.url should be used instead. [EL Info]: 2009-06-09 09:23:48.156--ServerSession(18680399)--Thread(Thread[main,5,main])--property eclipselink.jdbc.password is deprecated, property javax.persistence.jdbc.password should be used instead.

>After a change to
<property name="javax.persistence.jdbc.driver" value="oracle.jdbc.driver.OracleDriver"/> <property name="javax.persistence.jdbc.url" value="jdbc:oracle:thin:@127.0.0.1:1521:orcl"/>
           <property name="javax.persistence.jdbc.user" value="user"/>
           <property name="javax.persistence.jdbc.password" value="pw"/>

>generates no more property warnings.


2) For your lack of DDL script output, check that you are using the following format. both drop-and-create-tables and create-tables will generate a "dropDDL.jdbc" file. The key is that you should use "eclipselink.application-location" and not the spec defined "javax.persistence.application-location" property yet.

>The following
<property name="eclipselink.ddl-generation" value="drop-and-create-tables"/> <property name="eclipselink.ddl-generation.output-mode" value="both"/> <property name="eclipselink.create-ddl-jdbc-file-name" value="ddl.txt"/> <property name="eclipselink.application-location" value="c:/opt"/>

>generates
dropDDL.jdbc
ddl.txt (with create table DDL entries)


3) Table generator within a program?
See the usage of the following class
http://fisheye2.atlassian.com/browse/eclipselink/trunk/foundation/org.eclipse.persistence.core/src/org/eclipse/persistence/tools/schemaframework/TableDefinition.java

by the class
http://fisheye2.atlassian.com/browse/eclipselink/trunk/foundation/org.eclipse.persistence.core/src/org/eclipse/persistence/tools/schemaframework/TableCreator.java

using the method call
public void replaceTables(org.eclipse.persistence.sessions.DatabaseSession session)

from for example
http://fisheye2.atlassian.com/browse/eclipselink/trunk/jpa/eclipselink.jpa.test/src/org/eclipse/persistence/testing/tests/jpa/metamodel/MetamodelTest.java

Note: When you use table generation in this way outside of standard JPA properties and annotations - you will be using native API of EclipseLink.


thank you
/michael


Gerhard Kratz wrote:
Hello, Michael,

thank you very much for your fast and helpful response. Your unsigned persistence jar-file really did it, the table generator works fine now.

In my case, which is admittedly a very simple one, it is even possible to generate tables with
<property name="*eclipselink.ddl-generation*" value="*create-tables*" />

I tried to boil my entity declaration down to the absolute necessary, the result is attached.

Some further feedback:
1. I changed all the prefixes of the properties in persistence.xml to javax.persistence as you recommended.
  But I'm still getting the follwing output lines:

[EL Info]: property eclipselink.jdbc.user is deprecated, property javax.persistence.jdbc.user should be used instead. [EL Info]: property eclipselink.jdbc.driver is deprecated, property javax.persistence.jdbc.driver should be used instead. [EL Info]: property eclipselink.jdbc.url is deprecated, property javax.persistence.jdbc.url should be used instead. [EL Info]: property eclipselink.jdbc.password is deprecated, property javax.persistence.jdbc.password should be used instead.

2. With the line
<property name="javax.persistence.ddl-generation.output-mode" value="both"/> I tried to prompt EclipseLink to output the DDL in a text file, as well, which I then couldn't find in the directory specified in the XML element <property name="javax.persistence.application-location" value="C:\JPA"/>

How can one call the table generator from within a program?

Let me say that I'm really impressed by your fast and effective support.

best regards

Gerhard


Michael O'Brien schrieb:
Gerhard,
Your directory structure looks fine - specifically the position of persistence.xml off of META-INF is good. You may use the following EclipseLink JPA SE schema generation example as a reference. There are differences in my database url (which includes a valid schema - IE no "null" schema) and ddl generation properties that include dropping the tables before recreating them - on each run.

*jdbc:oracle:thin:@127.0.0.1:1521:orcl
*<property name="*eclipselink.ddl-generation*" value="*drop-and-create-tables*" />

http://dev.eclipse.org/svnroot/rt/org.eclipse.persistence/trunk/examples/org.eclipse.persistence.example.jpa.server.common.ddlgen/

For point #6 where you get a signed jar exception after adding eclipselink to your project... - you can use the following unsigned persistence jar - I had the same issue when initially setting up Tomcat for SE persistence a couple days ago.

http://dev.eclipse.org/svnroot/rt/org.eclipse.persistence/trunk/plugins/javax.persistence_unsigned_for_testing_1.0.0.jar

- the deprecated jdbc properties are ok - just change to using javax.persistence prefixes for the future


    For point #7
    - I have specified my schema on the url
- I have modified sequence generation on my entity from the original Dali entity source generation.
http://dev.eclipse.org/svnroot/rt/org.eclipse.persistence/trunk/examples/org.eclipse.persistence.example.jpa.server.common.ddlgen/src/org/eclipse/persistence/example/jpa/server/business/Cell.java

    thank you
    /michael


Gerhard Kratz wrote:
Hello,

my e-mail client seems to have a line-feed aversion. What seems important to me with the directory structure is: - that file persistence.xml seems to be in the right place, namely in the subdirectory META-INF
- a class file has been generated

best regards

Gerhard
_______________________________________________
eclipselink-users mailing list
eclipselink-users@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/eclipselink-users

------------------------------------------------------------------------

_______________________________________________
eclipselink-users mailing list
eclipselink-users@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/eclipselink-users

--
Prof. Dr. Gerhard Kratz
Fachhochschule Frankfurt am Main
Fachbereich 2: Informatik und Ingenieurwissenschaften
Nibelungenplatz 1
60318 Frankfurt am Main
WWW: http://www.fh-frankfurt.de/~g_kratz
     http://bscw.fh-frankfurt.de
------------------------------------------------------------------------

_______________________________________________
eclipselink-users mailing list
eclipselink-users@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/eclipselink-users


James Sutherland wrote:
The signing issue was from an issue with making the persistence.jar signed,
because EclipseLink ships JPA 2.0 classes in its own jar.  You need to
either use the unsigned version of the persistence.jar (one that used to be
included in EclipseLink, or one from any other source), or replace your JPA
1.0 persistence.jar with the JPA 2.0 persistence.jar.



Gerhard Kratz wrote:
Hello,

since a few days I keep trying to generate SQL tables with EclipseLink and Dali (JavaSE). I made the following experiment:

- using SQLExplorer I created an SQL table "employee" in database "test"
- set up a JPA project "Employee_1"
- successfully generated the entity "employee" from the above table with the JPA tools
- again with SQLExplorer, dropped the table employee from the database
- unsuccessfully tried to re-generate this table from the entity

1. Software configuration:

  eclipse-jee-ganymede-SR2-win32
  eclipselink-2.0.0.v20090604-r4409
  wtp-S-3.1RC3-20090602055316

  MySQL 5.1
  mysql-connector-java-5.1.7


2. The configuration of the JPA project:

  projekt name: Employee_1
  target runtime: <None>
  configuration: Employee_1_Facets, containing:
    - Java 6.0
    - Java Persistence 1.0
    - Utility Module
    - Platform: EclpiseLink
- Connection: MySQL-2, via MySQL JDBC Driver with the following properties:
      - Database: test
      - URL: jdbc:mysql://localhost:3306/
      - User name: <user name>
      - Password: <password>
      [x] Save password
      When testing this connection the ping was successful.
    - implementation library: ECLIPSELINK_USER_LIB, containing:
      - eclipselink.jar
      - javax.persistence_1.0.0v200905011740.jar
      - javax.persistence_2.0_preview.jar
    - Persistent class management: Discover annotated classes
automatically
    [x] Create orm.xml
  3. persistence.xml:

  <?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence""http://www.w3.org/2001/XMLSchema-instance"http://java.sun.com/xml/ns/persistencehttp://java.sun.com/xml/ns/persistence/persistence_1_0.xsd";>
    <persistence-unit name="Employee_1" transaction-type="RESOURCE_LOCAL">
      <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
      <properties>
<property name="eclipselink.jdbc.url" value="jdbc:mysql://localhost:3306/"/>
        <property name="eclipselink.jdbc.user" value= <user name> />
        <property name="eclipselink.jdbc.password" value= <password> />
<property name="eclipselink.jdbc.driver" value="com.mysql.jdbc.Driver"/>
        <property name="eclipselink.ddl-generation"
value="create-tables"/>
<property name="eclipselink.ddl-generation.output-mode" value="both"/> <property name="eclipselink.application-location" value= <location> />
      </properties>
    </persistence-unit>
  </persistence>

4. Project directory tree after generating entity class "employee" from the respective table:

  Employee_1
  |   .classpath
  |   .project
  |    +---.settings
  |       org.eclipse.jdt.core.prefs
  |       org.eclipse.jpt.core.prefs
  |       org.eclipse.jst.common.project.facet.core.prefs
  |       org.eclipse.wst.common.component
  |       org.eclipse.wst.common.project.facet.core.xml
  |        +---build
  |   +---classes
  |       +---employee1
  |       |       Employee.class
  |       |        |       +---META-INF
  |               MANIFEST.MF
  |               orm.xml
  |               persistence.xml
  +---src
      +---employee1
      |       Employee.java
      |            +---META-INF
              MANIFEST.MF
              orm.xml
              persistence.xml
5. Trying to generate table "employee" gives the following error message:

Exception in thread "main" javax.persistence.PersistenceException: No Persistence provider for EntityManager named Employee_1 at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:89)
    at org.eclipse.jpt.eclipselink.core.ddlgen.Main.execute(Main.java:77)
    at org.eclipse.jpt.eclipselink.core.ddlgen.Main.main(Main.java:65)

although I named a persistence provider in my persistence.xml which is contained in eclipselink.jar which itself is included in my user library ECLIPSELINK_USER_LIB.

6. Next, I imported this project into a newly installed workspace with a shorter pathname without any spaces ("C:\JPA").
  Now, in persistence.xml the following line is added:
    <class>employee1.Employee</class>

  When I try again to generate the table, I get this error message:

[EL Finest]: 2009-06-08 11:23:11.296--ServerSession(22522451)--Thread(Thread[main,5,main])--property=eclipselink.logging.timestamp; value=false [EL Finest]: ServerSession(22522451)--Thread(Thread[main,5,main])--property=eclipselink.logging.thread; value=false [EL Finest]: ServerSession(22522451)--property=eclipselink.logging.session; value=false
[EL Finest]: property=eclipselink.logging.exceptions; value=true
[EL Finest]: Begin predeploying Persistence Unit Employee_1; state Initial; factoryCount 0 [EL Info]: property eclipselink.jdbc.user is deprecated, property javax.persistence.jdbc.user should be used instead. [EL Info]: property eclipselink.jdbc.driver is deprecated, property javax.persistence.jdbc.driver should be used instead. [EL Info]: property eclipselink.jdbc.url is deprecated, property javax.persistence.jdbc.url should be used instead. [EL Info]: property eclipselink.jdbc.password is deprecated, property javax.persistence.jdbc.password should be used instead.
[EL Finest]: property=eclipselink.weaving; value=false
[EL Finest]: property=eclipselink.orm.throw.exceptions; value=true
[EL Finer]: Searching for default mapping file in file:/C:/JPA/Employee_1/build/classes/ [EL Finer]: Found a default mapping file at file:/C:/JPA/Employee_1/build/classes/META-INF/orm.xml for root URL file:/C:/JPA/Employee_1/build/classes/ [EL Finer]: Searching for default mapping file in file:/C:/JPA/Employee_1/build/classes/ [EL Config]: The access type for the persistent class [class employee1.Employee] is set to [FIELD]. [EL Config]: The alias name for the entity class [class employee1.Employee] is being defaulted to: Employee.
Exception in thread "main" Local Exception Stack:
Exception [EclipseLink-30005] (Eclipse Persistence Services - 2.0.0.v20090604-r4409): org.eclipse.persistence.exceptions.PersistenceUnitLoadingException Exception Description: An exception was thrown while searching for persistence archives with ClassLoader: sun.misc.Launcher$AppClassLoader@11b86e7 Internal Exception: javax.persistence.PersistenceException: Exception [EclipseLink-28018] (Eclipse Persistence Services - 2.0.0.v20090604-r4409): org.eclipse.persistence.exceptions.EntityManagerSetupException Exception Description: Predeployment of PersistenceUnit [Employee_1] failed. Internal Exception: java.lang.SecurityException: class "javax.persistence.ElementCollection"'s signer information does not match signer information of other classes in the same package at org.eclipse.persistence.exceptions.PersistenceUnitLoadingException.exceptionSearchingForPersistenceResources(PersistenceUnitLoadingException.java:121) at org.eclipse.persistence.jpa.PersistenceProvider.createEntityManagerFactory(PersistenceProvider.java:133) at org.eclipse.persistence.jpa.PersistenceProvider.createEntityManagerFactory(PersistenceProvider.java:67) at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:83)
   at org.eclipse.jpt.eclipselink.core.ddlgen.Main.execute(Main.java:77)
   at org.eclipse.jpt.eclipselink.core.ddlgen.Main.main(Main.java:65)
Caused by: javax.persistence.PersistenceException: Exception [EclipseLink-28018] (Eclipse Persistence Services - 2.0.0.v20090604-r4409): org.eclipse.persistence.exceptions.EntityManagerSetupException Exception Description: Predeployment of PersistenceUnit [Employee_1] failed. Internal Exception: java.lang.SecurityException: class "javax.persistence.ElementCollection"'s signer information does not match signer information of other classes in the same package at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.predeploy(EntityManagerSetupImpl.java:879) at org.eclipse.persistence.internal.jpa.deployment.JPAInitializer.callPredeploy(JPAInitializer.java:110) at org.eclipse.persistence.internal.jpa.deployment.JPAInitializer.initPersistenceUnits(JPAInitializer.java:159) at org.eclipse.persistence.internal.jpa.deployment.JPAInitializer.initialize(JPAInitializer.java:144) at org.eclipse.persistence.jpa.PersistenceProvider.createEntityManagerFactory(PersistenceProvider.java:105)
   ... 4 more
Caused by: Exception [EclipseLink-28018] (Eclipse Persistence Services - 2.0.0.v20090604-r4409): org.eclipse.persistence.exceptions.EntityManagerSetupException Exception Description: Predeployment of PersistenceUnit [Employee_1] failed. Internal Exception: java.lang.SecurityException: class "javax.persistence.ElementCollection"'s signer information does not match signer information of other classes in the same package at org.eclipse.persistence.exceptions.EntityManagerSetupException.predeployFailed(EntityManagerSetupException.java:210)
   ... 9 more
Caused by: java.lang.SecurityException: class "javax.persistence.ElementCollection"'s signer information does not match signer information of other classes in the same package
   at java.lang.ClassLoader.checkCerts(Unknown Source)
   at java.lang.ClassLoader.preDefineClass(Unknown Source)
   at java.lang.ClassLoader.defineClass(Unknown Source)
   at java.security.SecureClassLoader.defineClass(Unknown Source)
   at java.net.URLClassLoader.defineClass(Unknown Source)
   at java.net.URLClassLoader.access$000(Unknown Source)
   at java.net.URLClassLoader$1.run(Unknown Source)
   at java.security.AccessController.doPrivileged(Native Method)
   at java.net.URLClassLoader.findClass(Unknown Source)
   at java.lang.ClassLoader.loadClass(Unknown Source)
   at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
   at java.lang.ClassLoader.loadClass(Unknown Source)
   at java.lang.ClassLoader.loadClassInternal(Unknown Source)
at org.eclipse.persistence.internal.jpa.metadata.accessors.objects.MetadataAnnotatedElement.isElementCollection(MetadataAnnotatedElement.java:345) at org.eclipse.persistence.internal.jpa.metadata.accessors.classes.ClassAccessor.buildAccessor(ClassAccessor.java:424) at org.eclipse.persistence.internal.jpa.metadata.accessors.classes.ClassAccessor.addAccessorFields(ClassAccessor.java:344) at org.eclipse.persistence.internal.jpa.metadata.accessors.classes.ClassAccessor.addAccessors(ClassAccessor.java:317) at org.eclipse.persistence.internal.jpa.metadata.accessors.classes.EntityAccessor.preProcess(EntityAccessor.java:600) at org.eclipse.persistence.internal.jpa.metadata.MetadataProject.processStage1(MetadataProject.java:1028) at org.eclipse.persistence.internal.jpa.metadata.MetadataProcessor.processORMMetadata(MetadataProcessor.java:451) at org.eclipse.persistence.internal.jpa.deployment.PersistenceUnitProcessor.processORMetadata(PersistenceUnitProcessor.java:297) at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.predeploy(EntityManagerSetupImpl.java:839)
   ... 8 more

7. After a few seconds, my entity class file Employee.java exhibits the following errors:
  - Schema "null" cannot be resolved for table "Employee"
  - Column "personid" cannot be resolved
  - Column "name" cannot be resolved

  I hope, someone can help me to get the table generator working.

  best regards

  Gerhard
xmlns:xsi= xsi:schemaLocation="




-----
http://wiki.eclipse.org/User:James.sutherland.oracle.com James Sutherland http://www.eclipse.org/eclipselink/
 EclipseLink ,  http://www.oracle.com/technology/products/ias/toplink/
TopLink Wiki: http://wiki.eclipse.org/EclipseLink EclipseLink , http://wiki.oracle.com/page/TopLink TopLink Forums: http://forums.oracle.com/forums/forum.jspa?forumID=48 TopLink , http://www.nabble.com/EclipseLink-f26430.html EclipseLink Book: http://en.wikibooks.org/wiki/Java_Persistence Java Persistence


Back to the top