“批量更新从更新[0]返回意外行数;实际行数:2;预期:1”是什么意思

时间:2014-11-17 14:57:23

标签: java jdbc entity entitymanager hibernate-entitymanager

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

@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

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

1 个答案:

答案 0 :(得分:1)

(评论太久了,所以添加答案)

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

您的@OneToMany映射很奇怪,可能是导致问题的原因(请查看documentation集合映射)。在此@OneToMany中,目标表(Term)包含源表(Synonyme)的外键。也就是说,ID可能不是您想要的列,而是类似SYNONYME_ID的列。您还可以发布您的表格结构,以便任何感兴趣的人都可以全面了解。一旦映射看起来没问题,如果在修复映射时它没有得到解决,则更容易找到问题的解决方案。