我想保存两个具有以下关系的实体:
@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
我不明白这个例外。它是什么意思,我能做什么?
答案 0 :(得分:1)
(评论太久了,所以添加答案)
您应该使用Synonyme.createSynonyme()
和Term.createTerm()
的代码更新问题。
您的@OneToMany
映射很奇怪,可能是导致问题的原因(请查看documentation集合映射)。在此@OneToMany
中,目标表(Term)包含源表(Synonyme)的外键。也就是说,ID
可能不是您想要的列,而是类似SYNONYME_ID
的列。您还可以发布您的表格结构,以便任何感兴趣的人都可以全面了解。一旦映射看起来没问题,如果在修复映射时它没有得到解决,则更容易找到问题的解决方案。