2010-12-16 1 views
2

Ich baue eine kleine Eclipse RCP mit ein bisschen JPA. Jetzt passiert etwas Seltsames:JPA, Eclipselink - Relationen werden bei neuer Transaktion gelöscht

Ich erstelle einige TopCategories mit einigen Unterkategorien, dies funktioniert wie vorgesehen. Die Beilagen werden im Protokoll gedruckt. Ich schließe die Anwendung und jetzt das Problem aufrichtet:

Die Kategorien haben eine Beziehung zu Bücher

Book.java

@Entity 
public class Book implements Serializable, PropertyChangeListener { 

    private static final long serialVersionUID = 4646743297687986216L; 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private long id; 

    private String name; 
    private boolean active = true; 

    @Temporal(TemporalType.TIMESTAMP) 
    private Date updated; 

    @Lob 
    private Set<Group> allowedGroups; 

    @Column(columnDefinition = "TEXT") 
    private String text; 

    private BookType type; 

    @ManyToOne 
    private TopCategory topCategory; 

    @ManyToOne 
    private SubCategory subCategory; 

    @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL) 
    private BookAttachment attachment; 


    @Transient 
    private PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this); 

    // ordinary getter/setter 

    @PrePersist 
    @PreUpdate 
    private void updateUpdated() { 
     this.updated = new Date(); 
    } 

} 

Nach dem Neustart und Abfragen Buch mit diesem select b from Book alle Subkategorien, die nicht sind verwendet gelöscht werden. Wenn eine Unterkategorie eine Beziehung zu Buch hat, bleibt sie in meiner DB. Warum das passiert?

Category.java

@MappedSuperclass 
public class Category implements Serializable { 

    private static final long serialVersionUID = 6091963773161164543L; 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private long id; 
    private String name; 

    @Temporal(TemporalType.TIMESTAMP) 
    private Date updated; 

    @Enumerated(EnumType.STRING) 
    private CategoryType type; 

    @Transient 
    private List<Snippet> snippets = new LinkedList<Snippet>(); 

    // ordinary getter/setter 

    @PrePersist 
    @PreUpdate 
    public void updateUpdated() { 
     this.updated = new Date(); 
    } 

} 

TopCategory.java

@Entity 
public class TopCategory extends Category { 

    @OneToMany(cascade = CascadeType.ALL) 
    private List<SubCategory> subCategories; 

    public TopCategory() { 
     setName(""); 
     setSubCategories(new ArrayList<SubCategory>()); 
    } 

    public List<SubCategory> getSubCategories() { 
     return subCategories; 
    } 

    public void setSubCategories(List<SubCategory> subCategories) { 
     this.subCategories = subCategories; 
    } 

    @Override 
    public void setType(CategoryType type) { 
     super.setType(CategoryType.topCategory); 
    } 

SubCategory.java

@Entity 
public class SubCategory extends Category { 

    @ManyToOne(cascade = CascadeType.ALL) 
    private TopCategory topCategory; 

    public TopCategory getTopCategory() { 
     return topCategory; 
    } 

    public void setTopCategory(TopCategory topCategory) { 
     this.topCategory = topCategory; 
    } 

    @Override 
    public void setType(CategoryType type) { 
     super.setType(CategoryType.subCategory); 
    } 
} 

Ich bin mit Eclipselink 2.1.1.

Grüße

+0

In Ordnung - Ich habe das Problem gefunden: Eine der Ergebnislisten von meinem Modell ist von einem Contentprovider modifiziert - das heißt, wurden nicht verwendet SubCategories werden entfernt, für den Fall, dass die Entity Objekte nicht getrennt wurden, verursachte es den EntityManger aktualisieren. – onigunn

Antwort

0

Okay - ich habe das Problem gefunden: Einer der Ergebnislisten von meinem Modell von einem Contentprovider geändert wird - dies wird nicht verwendet wurde Unterkategorien entfernt werden, in dem Fall, dass die Entitätsobjekten nicht waren losgelöst hat es den EntityManger zur Aktualisierung veranlasst.