Я строю небольшой RCP затмения с небольшим количеством JPA. Сейчас происходит нечто странное:
Я создаю несколько TopCategories с некоторыми подкатегориями, это работает как задумано. Вставки печатаются в журнале. Я закрываю свое приложение, и теперь возникает проблема:
Категории имеют отношение к книгам
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();
}
}
После перезапуска и запроса Book с этим select b from Book
все Подкатегории, которые не используются, удаляются. Если подкатегория имеет отношение к книге, она остается в моей БД. Почему это происходит?
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);
}
}
Я использую Eclipselink 2.1.1.
Привет