2012-06-25 21 views
1

我有一个JPA/Hibernate对象,它使用复合键作为主键。我正在尝试从数据库读取对象并进行更新。JPA /休眠 - x实例的标识符被更改异常

可以说主键是(id和name),并且数据库中存在以下行。

1 john London 
2 bob Birmingham 
3 Dave Kent 

如果我使用键(1,约翰)加载对象,然后一切正常。

org.hibernate.HibernateException: identifier of an instance of Document was altered from com.myPck.test1.documentsPK[ Id=1, msgOwner=john ] to com.myPck.test1.documentsPK[ Id=1, msgOwner=John ]; 

后我加载行我也更新它使用JPQL,但我不更新任何的:如果我使用相同的主,但使用的不同情况(1,约翰),然后我得到下面的异常加载它主键列。有趣的是,如果我搜索一个不存在的行,我不会得到这个异常。它只会发生,如果我搜索一个确实存在的行,但在密钥上使用的情况与实际在数据库中不同。

什么可能导致这种情况,我该如何解决它?

谢谢

+0

mysql? (更多的字符,只是忽略) – esej

回答

2

您可以发布您正在使用的复合密钥类的代码。我的猜测是,你在复合主键类上有一个糟糕的equals和hashCode方法。

+0

谢谢 - 你是对的。问题与quals方法中的登录有关。 equals()方法用于比较字符串而不是equalsIgnoreCase()。 – ziggy