JPA, Eclipselink - отношения удаляются при новой транзакции - PullRequest
2 голосов
/ 16 декабря 2010

Я строю небольшой 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.

Привет

1 Ответ

0 голосов
/ 14 мая 2012

Хорошо - я обнаружил проблему: один из списков результатов из моей модели изменен с поставщика контента - он не использовался. Подкатегории удаляются, в случае, если объекты сущности не были отсоединены, это вызывало управление сущностью обновить.

...