2012-11-13 66 views
5

我對Hibernate有一個奇怪的問題(對我來說),這是我無法理解的。下面 的代碼是我在使用與案例是我聚合根額外的實體CaseToSuggestion實體案例和建議之間的屬性建模多對一關係的嘗試:Hibernate爲新的子實體生成ghost條目

@Entity 
@Table(name = "sga_cases") 
public class Case { 

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

    // Business key 
    @Column(name = "caseid", unique = true, nullable = false) 
    private String caseId; 

    ... 

    @OneToMany(mappedBy = "associatedCase", orphanRemoval = true, cascade = CascadeType.ALL) 
    private Set<CaseToSuggestion> associatedSuggestions = new HashSet<CaseToSuggestion>(); 

    ... 
} 


@Entity 
@Table(name = "sga_suggestions") 
public class Suggestion { 

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

    @Column(name = "suggestionid", unique = true, nullable = false) 
    private String suggestionId; 

    @Column(name = "localizationkey", nullable = false) 
    private String localizationKey; 

    @OneToMany(mappedBy = "associatedSuggestion", orphanRemoval = true, cascade = CascadeType.ALL) 
    private Set<CaseToSuggestion> caseMapping = new HashSet<CaseToSuggestion>(); 

    ... 
} 


@Entity 
@Table(name = "sga_case2suggestion") 
public class CaseToSuggestion { 

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

    @Column(name = "feedback") 
    private float feedback; 

    @ManyToOne 
    @JoinColumn(name = "caseid") 
    private Case associatedCase; 

    @ManyToOne(cascade = CascadeType.ALL) 
    @JoinColumn(name = "suggestionid") 
    private Suggestion associatedSuggestion; 

    ... 
} 

如果我創建上述實體的新對象,設置相應的關聯,然後存儲它們與EntityManager的一切工作正常:

Case c = new Case(...) 
Suggestion sugg = new Suggestion(...); 
CaseToSuggestion case2sugg = new CaseToSuggestion(c, sugg, 1.0f); 

c.getAssociatedSuggestions().add(case2sugg); 
sugg.getAssociatedCases().add(case2sugg); 

通過entityManager.persist(c);

其次如果我想添加一個新的ASSO ciation的案例已在我檢索案例和建議實體我想從EntityManager的關聯,並將它們添加到一個新的CaseToSuggestion數據庫:

CaseToSuggestion c2s = new CaseToSuggestion(c, s, fb); 
c.getAssociatedSuggestions().add(c2s); 
s.getAssociatedCases().add(c2s); 

其次entityManager.merge(c);

的的CaseToSuggestion實體存儲在數據庫中,但對於每一個進入我得到一個「鬼條目」用新生成的ID和各個領域空:

+----+----------+--------+--------------+ 
| id | feedback | caseid | suggestionid | 
+----+----------+--------+--------------+ 
| 3 |  1 |  3 |   1 | 
| 4 |  1 |  4 |   2 | 
| 5 |  1 |  5 |   2 | 
| 6 |  0 | NULL |   NULL | 
| 7 |  1 |  6 |   2 | 
| 8 |  0 | NULL |   NULL | 
| 9 |  1 |  7 |   2 | 
| 10 |  0 | NULL |   NULL | 
+----+----------+--------+--------------+ 

沒有任何人有一個想法是什麼可能會導致這樣?

+0

什麼是一個漂亮的第一個問題(嚴重) – Sheena

+1

我認爲這個問題可能出現在級聯中,試着只保留聚合根下的級聯從Case-CaseToSuggestion-> Suggestion'的依賴樹,然後刪除級聯那是在另一個方向。 – Augusto

+0

感謝您的提示。我在「建議」中刪除了級聯,但不幸的是問題仍然存在。 – fiendie

回答

1

好的,我明白了。 刪除建議中的OneToMany-Mapping完全解決了我的問題。