2012-11-13 12 views
5

Herhangi bir anlam ifade edemediğim Hibernate ile ilgili bir garip (zaten) sorunum var. Aşağıdaki kod Vaka benim agrega kök olmak ek bir varlık CaseToSuggestion kullanarak varlıklar Vaka ve Öneri arasında bir özelliğe sahip bir ManyToOne ilişkisini modelleme benim girişimi:Hibernate, yeni çocuk varlıkları için hayalet girişleri üretir

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

    ... 
} 

yukarıdaki varlıklar için yeni nesneler oluşturursanız, uygun dernek ayarlayın ve sonra EntityManager her şey çalışıyor bunları saklamak:

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

ardından yeni bir asso eklemek istiyorsanız

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

entityManager.merge(c);

CaseToSuggestion varlık Ardından: Ben EntityManager dan ilişkilendirmek ve yeni CaseToSuggestion eklemek istediğiniz Vaka ve Öneri varlıkları almak veritabanında zaten bir Case ciation

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

herkes bu neden olabilir bir fikrin var mı: veritabanında ama boş bir yeni oluşturulan kimliği ve tüm alanlarla bir "hayalet girişi" olsun her giriş için saklanmaktadır?

+0

Ne güzel bir soru (ciddi) – Sheena

+1

Sanırım sorun kaskadlarda olabilir, bağımlılık ağacından sadece Kaskadları korumaya çalışın 'Case -> CaseToSuggestion -> Suggestion', ve cascades'i kaldırın diğer yöne gitmek. – Augusto

+0

İpucu için teşekkürler. Cascade'i 'Öneri' bölümünde kaldırdım ama maalesef sorun hala var. – fiendie

cevap

1

Tamam, anladım. Öneride OneToMany Eşlemesini Kaldırma, tamamen benim için sorunu çözdü.