我是Hibernate(5.2.3.final)的新手,并尝试将它用于私有项目以熟悉它。数据库是本地服务器上的MariaDB(5.5.53-0070),Hibernate方言设置为“org.hibernate.dialect.MySQL5InnoDBDialect”
在我的申请中,我有两个班级年级和年级。每年可能包含用户定义的几个等级。我尝试让Hibernate使用@OrderColumn (name="listOrder")
保存成绩列表的顺序。
到目前为止这很好用,我只是重新排序列表的问题:
每当我从列表中删除一个项目以将其插入同一列表中的另一个位置时,Hibernate就会创建一个导致QueryException的更新语句。
我的测试代码如下:
// grades is the list managed by Hibernate, it contains 4 entries
// here it is received from the first Year entry in the database
List<Grade> grades = ym.getElementAt(0).getGrades();
SessionUtil.beginTransaction();
Grade grade = grades.get(0);
grades.remove(0); // remove from current position
SessionUtil.flush();
grades.add(grade); // add to end of list
SessionUtil.commitTransaction();
在刷新期间(删除元素之后),我得到一个由更新语句引起的异常:
Exception in thread "main" javax.persistence.PersistenceException: org.hibernate.exception.ConstraintViolationException: could not execute statement
[... many lines ...]
Caused by: org.mariadb.jdbc.internal.util.dao.QueryException: Duplicate entry '10' for key 'UK_3o21jcxyfab7r95ikn8at88ih'
Query is: update Year_Grade set grades_id=? where Year_id=? and listOrder=?, parameters [10,1,0]
据我所知,相同的grades_id可能不会在同一个列表中(或甚至在任何列表中)存在两次。我只是没有看到,为什么Hibernate会这样做,而不是只更新年份/等级组合的listOrder列。
在课程年级我定义包含成绩对象的列表:
@OneToMany
@OrderColumn(name="listOrder")
private List<Grade> grades = new DataObjectList<Grade>();
public List<Grade> getGrades() {
return grades;
}
在小学一年级,我没有指向年份的变量,因为我总是只在一个方向上访问数据(从年级到年级到主题到...)
我已经阅读了Hibernate或JBoss网站上的在线文档,并且已经使用了Google几个小时了。我发现的所有建议似乎都没有解决我的问题。
这可能是数据库的错误方言吗?我错过了一些注释吗?
提前感谢您的帮助......