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
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