1

我想保存两个具有以下关系的实体:

@Entity
public class Synonyme {
    @OneToMany(fetch=FetchType.LAZY, cascade=CascadeType.ALL, orphanRemoval = true)
    @JoinColumn(name="ID", nullable = false)
    private List<Term> terms = new ArrayList<>();
}

@Entity
public class Term {
   private String word;
   public static createTerm(String word, Synonyme newSyn, Long someothercriteria) {
    Term term = new Term();
    ...
    newSyn.addTerm(term);
   }
}

我想像这样保存它们:

Synonyme newSyn= Synonyme.createSynonyme ();

entityManager.persist(newSyn);

for(String word : words) {
    Term term = Term.createTerm(word, newSyn, 0L );
}

 entityManager.flush();

这些代码在 Junit-Test 中运行良好(Junit-Test 使用 spring 的内存数据库),但如果我在真实数据库中使用它们,我得到以下异常:

Caused by: javax.persistence.PersistenceException: org.hibernate.jdbc.BatchedTooManyRowsAffectedException: Batch update returned unexpected row count from update [0]; actual row count: 2; expected: 1

我不明白这个例外。这是什么意思,我能做什么?

4

2 回答 2

1

(评论太长,所以添加一个答案)

Synonyme.createSynonyme()您应该使用和的代码更新问题Term.createTerm()

您的@OneToMany映射很奇怪,这可能是问题的原因(查看集合映射的文档)。在此@OneToMany目标表(术语)包含源表(同义词)的外键。也就是说,ID可能不是您想要的列,而是类似SYNONYME_ID. 您还可以发布您的表格结构,以便任何有兴趣的人都可以了解全貌。一旦映射看起来没问题,如果在修复映射后问题没有得到解决,那么寻找问题的解决方案会更容易。

于 2014-11-18T10:36:37.057 回答
0

这通常意味着您在 hibernate 中定义了一个主键,而不是在实际的 DBMS 上。

现在有 2 行具有相同的主键(“实际行数为 2,预期为 1”),因此 hibernate 甚至无法执行简单的非更新查询(!)。

要修复,请在 DBMS 中删除重复的行或更改该表上的休眠键定义。

于 2021-09-14T17:58:54.737 回答