Announcement

Collapse
No announcement yet.

unidirektionale OneToMeny Beziehung mit JPA 2.0

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • unidirektionale OneToMeny Beziehung mit JPA 2.0

    hallo zusammen,

    ich versuche verzweifelt mit JPA eine unidirektionale OneToMeny Beziehung zu realiseren. Beim Auslesen aus der DB funktioniert alles. So bald ich aber ein File-Objekt erzeuge und persistiere kracht es mit folgender Fehlermeldung:

    Exception in thread "main" javax.persistence.RollbackException: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.3.2.v20111125-r10461): org.eclipse.persistence.exceptions.DatabaseExcepti on
    Internal Exception: java.sql.SQLIntegrityConstraintViolationException: Die Spalte 'family' akzeptiert keinen Nullwert.
    Error Code: -1
    Call: INSERT INTO FILE (NAME) VALUES (?)
    bind => [1 parameters bound]
    Offentsichtlich wird die Spalte family, bei der es sich um den Foreign Key zur Tabelle directory handelt, nicht gefüllt. Warum?


    Code:
    @Entity
    public class Family {
        
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private int id;
        private String name;
        @OneToMany(cascade = CascadeType.ALL)
        @JoinColumn(name="FAMILY", referencedColumnName="ID") 
        private Collection<Person> person;
        
    ...
    }
    
    
    @Entity
    public class Person {
    
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private int id;
        private String name;
    ...
    }
    
    
    public static void main(String[] args) {
    
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("DBPrototypPU");
        EntityManager em = emf.createEntityManager();
    
    
     // 1.Vorgang: funktioniert
        Family f = (Family) em.find(Family.class, 1);
        System.out.println(f.getName()); // Name der Familie
        System.out.println(f.getPerson().size()); // Anzahl Personen
    
    
    // 2.Vorgang: das erstellen und persistieren einer neuen Person aber nicht
            em.getTransaction().begin();
            
            f = (Family) em.find(Family.class, 1);
            
            Person p = new Person();
            p.setName("Mustermann");
            
            f.getPerson().add(p);
            
            em.persist(f);
            em.getTransaction().commit();
    }

    Datenbank:

    Tabelle: Family
    Spalte 1: ID (PK)
    Spalte 2: NAME

    Tabelle: Person
    Spalte 1: ID (pk)
    Spalte 2: FAMILY (fk)
    Spalte 3: NAME

    In jeder Tabelle ist jeweils ein Eintrag vorhanden. Der FK des Eintrags aus der Tabelle Person referenziert auf den PK der Tabelle Family.


    siehe Referenzbeispiel:
    http://stackoverflow.com/questions/3...ntity-bean-jpa


    Was habe ich falsch gemacht? Danke.
    Zuletzt editiert von chehilbi; 16.08.2012, 07:12.

  • #2
    Es ist schlecht, eigene Klassen so zu benennen, wie Klassen die im System vorhanden sind. Was für eine Klasse FILE wird in deiner main inportiert?
    Christian

    Comment


    • #3
      Die Namen sind nur exemplarisch. Eigentlich heissen meine Klassen anderst. Könnten auch Familie und Person heissen.

      Comment


      • #4
        ok, melde dich wieder, wenn der Original-Code zur Verfügung steht
        Christian

        Comment


        • #5
          Der Orginalcode unterscheidet sich nicht von dem obigen. Ich habe für den Forumbeitrag nur die Klassennamen geändert.

          Comment


          • #6
            Dann halt exemplarisch

            http://www.java2s.com/Code/Java/JPA/...nalMapping.htm
            Christian

            Comment


            • #7
              Das habe ich bereits versucht. Hat auch nicht geholfen. Erhalten dieselbe Fehlermeldung.

              Statt

              @JoinColumn(name="DIRECTORY", referencedColumnName="ID")

              habe ich ein JoinTable verwendet

              @JoinTable(name = "FILE", joinColumns = @JoinColumn(name = "ID"), inverseJoinColumns = @JoinColumn(name = "DIRECTORY"))

              Comment


              • #8
                gibts keine Lösung?

                Comment


                • #9
                  Wozu soll man sich das anschauen? Das ist nicht der Code, der wirklich da ist.

                  Allein schon das merhfache deklarieren von "Dir" im obigen Code dürfte so nicht gehen.

                  Dann kann man nur sagen, schau dur den Code aus Beitrag #6 an der geht; teste diesen aus

                  Wenn dein Auto kaputt ist, leihst du dir dann ein identischen Wagen und fährst zur Werkstatt? Dann sagen die "Naja, einen Fehler können wir nicht finden". Deine Antwort ist dann "Es ist ja auch der Wagen kaputt, der zu Hause steht, aber er ist genau wie dieser"??
                  Christian

                  Comment


                  • #10
                    so ich habe den code angepasst...

                    Wie gesagt das abrufen der Objekte aus der Datenbank funktioniert und offensichtlich auch das Mapping (Vorgang 1). So bald ich aber ein neues Personen Objekt anlege kracht es. Irgendwie gibt es beim Einfügen neuer Objekte in die DB ein Problem.

                    Comment


                    • #11
                      ich denke ich habe es.

                      Im Foreign Key [I]Familiy[/] Feld müssen in der DB NULL-Werte möglich sein. Dann funktioniert es...

                      Comment


                      • #12
                        Wo befand sich ein nullable=false? Default ist true
                        Christian

                        Comment


                        • #13
                          in meiner datenbank war das feld als nullable=true definiert

                          Comment


                          • #14
                            Damit sind null-Werte zulässig
                            Christian

                            Comment


                            • #15
                              finde ich nur komisch, dass diese einstellung notwendig ist, denn der foreign key wird trotzdem gefüllt. So soll es ja auch sein. Vermutlich wird mit der INSERT-Anweidung alle anderen Spalten gefüllt und der Foreign Key nachträglich über ein Update.

                              Auf jeden Fall funktioniert es!

                              Comment

                              Working...
                              X