JPA Toplink Derby "Drop and Create Tables" funktioniert nicht!


Merschi

Grünschnabel
Hallo,

beim deployen werden/wird die Tabelle in der Datenbank nicht automatisch gedropped und created, obwohl ich es als property angegeben habe.

Meine Persitence.xml sieht folgender massen aus:

Code:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.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_1_0.xsd">
  <persistence-unit name="KeyGenPU" transaction-type="JTA">
    <provider>oracle.toplink.essentials.PersistenceProvider</provider>
    <jta-data-source>jdbc/sample</jta-data-source>
    <properties>
      <property name="toplink.ddl-generation" value="drop-and-create-tables"/>
    </properties>
  </persistence-unit>
</persistence>
Meine Entity Klasse so:

Code:
@Entity
@Table(name = "NEWENTITY")
@NamedQueries({@NamedQuery(name = "Newentity.findById", query = "SELECT n FROM Newentity n WHERE n.id = :id"), @NamedQuery(name = "Newentity.findByFirstname", query = "SELECT n FROM Newentity n WHERE n.firstname = :firstname")})
public class Newentity implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name = "ID", nullable = false)
    private Long id;
    @Column(name = "FIRSTNAME")
    private String firstname;

    public Newentity() {
    }

    public Newentity(Long id) {
        this.id = id;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getFirstname() {
        return firstname;
    }

    public void setFirstname(String firstname) {
        this.firstname = firstname;
    }
}
Ich verwende:

- Netbeans 6
- Derby
- Toplink

Wäre nett, wenn mir jemand dieses Verhalten erklären könnte.
 

Oliver Gierke

Erfahrenes Mitglied
1. Tipp: vergiss Toplink. Das ist zwar die Referenzimplementierung, allerdings tut es an vielen Stellen nicht das, was es soll (unerwartetes Kaskadieren, untertützt nicht alle Vererbungstpyen, benötigt einen Weaver um die Entities zu erweitern usw.). Hibernate ist in jeglicher Hinsicht die bessere Wahl (ausser vielleicht bei der Jar größe ;) ).

Zu deinem Problem: die property in der Konfiguration sorgt erstmal nur dafür, dass das SQl erzeugt wird (deswegen auch ddl-creation). Um das zeug auf die Datenbank zu schießen bedarf es einer weiteren Property "toplink.ddl-generation.output-mode" die auf "both" gesetz sein muss (http://www.oracle.com/technology/pr.../toplink-jpa-extensions.html#Java2DBSchemaGen).

Gruß
Ollie
 

Merschi

Grünschnabel
Vielen Dank für die schnelle Antwort. Da ich sowieso noch am Anfang stehe werde ich mir dann wohl Hibernate anschauen, da ich in der Tat auch schon an anderen Stellen bei Toplink auf rätselhaftes Verhalten gestossen bin und nur am recherchieren bin.