2010-12-16 104 views
2

我正在構建一個帶有一點JPA的小eclipse rcp。現在發生了一些奇怪的事情:JPA,Eclipselink - 關係在新交易中被刪除

我用一些SubCategories創建了一些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(); 
    } 

} 

重啓和查詢預訂,這select b from Book之後,是不是所有的子類別使用被刪除。如果一個子類與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。

問候

+0

好的 - 我發現了這個問題:我的模型中的一個結果列表是從contentprovider修改的 - 這不是使用SubCategories被刪除,如果實體對象沒有分離,它會導致entitymanger更新。 – onigunn 2010-12-16 18:03:32

回答

0

好了 - 我已經找到了問題:一是從我的模型的結果中列出的是從ContentProvider的修改 - 這是沒有用的子類別被刪除,以防該實體對象是不可分離,它導致了entitymanger更新。