5

我对 Hibernate 有一个奇怪的(无论如何对我来说)问题,我无法理解。下面的代码是我尝试使用附加实体 CaseToSuggestion 对实体 Case 和 Suggestion 之间的属性建模 ManyToOne 关系,其中 Case 是我的聚合根:

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

如果我想为已经在数据库中的案例添加新的关联,我会从 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 |
+----+----------+--------+--------------+

有人知道可能导致这种情况的原因吗?

4

1 回答 1

1

好,我知道了。删除建议中的 OneToMany-Mapping 完全解决了我的问题。

于 2012-11-13T16:31:16.713 回答