This week's book giveaway is in the Kotlin forum.
We're giving away four copies of Kotlin in Action and have Dmitry Jemerov & Svetlana Isakova on-line!
See this thread for details.
Win a copy of Kotlin in Action this week in the Kotlin forum!
  • Post Reply Bookmark Topic Watch Topic
  • New Topic

hibernate - insert object failed because of foreing key violation  RSS feed

Lee Lifshits
Posts: 1
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
Hello all -
I have a a table events that generates it's primary key. This table has another table (insertion_string) that associated to it with a foreign key. My DB is postgres.

<class name="com.oversi.generated.generatedFiles.Events" table="events" schema="public">
<id name="eventId" type="long">
<column name="event_id" />
<generator class="sequence">
<param name="sequence">events_event_id_seq</param>
<set name="insertionsStrings" inverse="true" cascade="all-delete-orphan" fetch="select">
<column name="event_id" not-null="true" />
<one-to-many class="com.oversi.generated.generatedFiles.InsertionsString" />

When I try to insert a new event object I get the error :

insert or update on table "insertions_string" violates foreign key constraint "insertions_string_event_id_fkey"
Detail: Key (event_id)=(0) is not present in table "events".

I think this is because hibernate try to insert to the foreign key table (insertion_string) before inserting to the events table ( the one with the primary key)
Please help me to solve this
Mark Spritzler
Posts: 17309
IntelliJ IDE Mac Spring
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
You, try putting the inverse="true" into the InsertionsString side of the relationship.

This is a very common issue that everyone seems to have happen to them. It seems to be more logical that the inverse would be on the one side of a many to one, but to get what we expect, parents getting inserted before their children, requires the inverse="true" to be on the Many side of the relationship.

If you think of it this way, wherever you put the inverse, Hibernate will think, ok, so this is the same relationship that is modeled in the other side, and lets use that mapping as the controlling force of this relationship. So by having it in the Many side, it puts the parent in control of the relationship, since after all it is responsible for creating its children. Unless it is by immaculate conception.

[ April 17, 2008: Message edited by: Mark Spritzler ]
It is sorta covered in the JavaRanch Style Guide.
  • Post Reply Bookmark Topic Watch Topic
  • New Topic
Boost this thread!