• Post Reply
  • Bookmark Topic Watch Topic
  • New Topic

Creating one-to-one mapping: ConstraintViolationException

 
Timothy Sam
Ranch Hand
Posts: 751
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
Hi guys,

I've been reading for sometime about hibernate but still could not pass beyond my "relationships" dilemma. I was wondering if anyone could help me setup my mappings(and classes) right.

Situation:

So I was doing a one-to-one relationship. Two tables are involved which are users_tbl and profiles_tbl. I get a ConstraintViolationException when I do an insert. Details below...

------------
users_table
------------
user_id
username
password
------------


------------
profiles_tbl
------------
user_id
display_name
about


And so I have the following classes...

User.java


Profile.java


And the following mappings

User.hbm.xml



Profile.hbm.xml



I have two DAO methods, selectAll and addUser. Select seems to work just fine. But the insert doesn't.



Services



I get the exception


org.hibernate.exception.ConstraintViolationException: could not insert: [com.myhibernate.dto.User]
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:94)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:64)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2186)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2666)
at org.hibernate.action.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:71)
at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:279)
at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:321)
at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:204)
at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:130)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:210)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:195)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:117)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93)
at org.hibernate.impl.SessionImpl.fireSaveOrUpdate(SessionImpl.java:534)
at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:526)
at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:522)
at com.myhibernate.dao.UserDAOImpl.addUser(UserDAOImpl.java:33)
at com.myhibernate.service.HibernateTrialService.addUser(HibernateTrialService.java:45)
at com.myhibernate.service.HibernateTrialServiceTest.testAddUser(HibernateTrialServiceTest.java:52)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at junit.framework.TestCase.runTest(TestCase.java:168)
at junit.framework.TestCase.runBare(TestCase.java:134)
at junit.framework.TestResult$1.protect(TestResult.java:110)
at junit.framework.TestResult.runProtected(TestResult.java:128)
at junit.framework.TestResult.run(TestResult.java:113)
at junit.framework.TestCase.run(TestCase.java:124)
at junit.framework.TestSuite.runTest(TestSuite.java:232)
at junit.framework.TestSuite.run(TestSuite.java:227)
at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:79)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:45)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry 'charlie' for key 2
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:406)
at com.mysql.jdbc.Util.getInstance(Util.java:381)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1015)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3515)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3447)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1951)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2101)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2554)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1761)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2046)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1964)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1949)
at org.hibernate.id.IdentityGenerator$GetGeneratedKeysDelegate.executeAndExtract(IdentityGenerator.java:94)
at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:57)
... 36 more




I'll appreciate any help. Thank you guys!
 
Sridhar Santhanakrishnan
Ranch Hand
Posts: 317
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
You seem to use generator = "identity".

1) Are you using one of DB2, MySQL, MS SQL Server, Sybase or HypersonicSQL?
2) The return type is Long. Identity returns long, short or int.
 
Timothy Sam
Ranch Hand
Posts: 751
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
Hi Sridhar


1) Are you using one of DB2, MySQL, MS SQL Server, Sybase or HypersonicSQL?


I'm using MySQL


2) The return type is Long. Identity returns long, short or int.


I'm using Java 5. My Select(find) works fine so I'm assuming autoboxing comes into play here?

Thanks, I hope you could give me some more inputs.
 
Sridhar Santhanakrishnan
Ranch Hand
Posts: 317
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
Hey Timothy,

com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException uplicate entry 'charlie' for key 2


I am not familiar with MySql. But are you sure that its not failing due to a duplicate entry?
[ December 08, 2008: Message edited by: sridhar skrishnan ]
 
Timothy Sam
Ranch Hand
Posts: 751
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
Hmmm... Didn't see that one. Yes, I was inserting the same info to users_tbl. But I thought saveOrUpdate method would only update the record on users_tbl and insert to profiles_tbl(since there's no record there yet). Am I getting it wrong?
 
Timothy Sam
Ranch Hand
Posts: 751
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
Hi again,

First of all, thanks to sridhar skrishnan for pointing out the cause of the exception.

Now, still based on the situation and codes above... I was wondering that even when I'm able to make a successful insert, I'm not able to insert anything to the profiles_tbl(no errors, just nothing inserted)? I hope somebody could point out why...

Below is the slightly modified code...



Thanks!
 
Sridhar Santhanakrishnan
Ranch Hand
Posts: 317
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
<one-to-one name="profile" class="com.myhibernate.dto.Profile"/>


try using
 
Timothy Sam
Ranch Hand
Posts: 751
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
Hi, sorry to have made this too long.

I tried your suggestion in User.hbm.xml only.



But still only give me the following result

Hibernate: insert into users_tbl (username, password) values (?, ?)

Hoping to get lucky, I tried this change in Profile.hbm.xml

<id column="user_id" name="userId" type="java.lang.Long" unsaved-value="-1"/>


Still no luck... Thanks again for all the help btw.
 
  • Post Reply
  • Bookmark Topic Watch Topic
  • New Topic