Hibernate Error – Identifier of an instance altered from 1 to 1
Problem:-Getting the error ” identifier of an instance of com.sample.db.Sample altered from 1 to 1″
Solution:- Check whether the java type of the identifier field in the Data Object, the type of the field in the hibernate xml file and the type of the column in the database are compatible types or not.
Explanation:- I had faced this strange problem today. I am using struts, hibernate and spring.
I found out that the problem roots from
public void
checkId(Object object, EntityPersister persister, Serializable id, EntityMode entityMode) method of DefaultFlushEntityEventListener class.
I solved this problem by changing the type of the id field in the class and the hbm.xml file.
We made some mistakes in declaring getter and setter methods and id field for this object. (therefore it is advisable to use Hibernate tools or other reverse engineer tools to generate your data object and hbm files)
The sample class was as follows
class Sample{
integer sampleId;
String sampleName;
public int getSampleId(){
….
}
public void setSampleId(int i){
…..
}
}
And this was the hbm file declaration
<id
name=”sampleId”
type=”integer”
column=”sample_id”
unsaved-value=”0″>
<generator class=”identity” />
</id>
<property
name=”sampleName”
type=”string”
column=”sample_name”
length=”50″
not-null=”true”
unique=”true”
/>
The problem was that in the database the type of the field was smallint which corresponds to the short data type in Java. Therefore somewhere in the org.hibernate.type.Type class hierarchy the
public boolean isEqual(Object x, Object y, EntityMode entityMode) method was failing.
What I did is I modified the Data Object and the hbm file like this
class Sample{
integer sampleId;
String sampleName;
public int getSampleId(){
public short getSampleId(){
….
}
public void setSampleId(int i){
public void setSampleId(short s){
…..
}
}
<id
name=”sampleId”
type=”integer”
type=”short”
column=”sample_id”
unsaved-value=”0″>
<generator class=”identity” />
</id>
11 Comments »
Leave a comment
-
Archives
- October 2009 (2)
- September 2009 (3)
- August 2009 (2)
- July 2009 (1)
- June 2009 (2)
- May 2009 (3)
- April 2009 (8)
- February 2009 (2)
- December 2008 (1)
- November 2008 (3)
- October 2008 (1)
- January 2008 (8)
-
Categories
-
RSS
Entries RSS
Comments RSS

good job…keep it up…..
Hi ,
I am facing exactly the similar problem in teradata database .
‘identifier of an instance of com.liferay.portal.model.impl.GroupImpl was altered from 1001 to 1001 ‘ .
My tables-hbm.xml file looks like this .
I have all getters and setters in String only . The datatype for groupId is also varchar .
Pls help .
Thanks
My tables-hbm.xml file looks like this .
Sorry missed this part .
tables-hbm.xml
chandrasekar.T
Thanks a lot. Mine was long in Java and int in the hbm file!
I faced the same problem and struggling for nearly a day. After looking at this site revisited my setters and getters and found I have return type as long for the getter and whereas the field was declared as int.
Thanks for the post.
Yes, i discovered something similar in my setters & getters causing same problem (i though).
Thanks for post man
Thank You for the post.
Thanks a lot. This works fine for me.
well described solution of problem
Hi all,
there is a problem always using primitive types with Hibernate. So, the solution is using java.lang.Integer as data-type for IDs, for example.
If you need more space to store the ID perhaps you’ll need to use the java.lang.Long … but … who’ll need such as space?!
Regards.
DonkanMcLeod
Yes, that’s correct. DonkanMcLeod. You should always use bigger datatypes in databases and as far as possible use hbm file generator tools to avoid “type-mismatch” errors.