Hi,
I'm learning Hibernate and I keep getting the same error messages when saving a object. I've searched the forum and read the manual, but can't figure this one out. Please help.
I've got 2 Tables: Parent and Child:
Code:
CREATE TABLE `parent` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(20) default NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE `child` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(30) default NULL,
`parent_id` int(11) NOT NULL default '0',
PRIMARY KEY (`id`),
KEY `parent_id` (`parent_id`),
CONSTRAINT `child_ibfk_1` FOREIGN KEY (`parent_id`) REFERENCES `parent` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Here are my Mapping Files for:
Parent:
Code:
<hibernate-mapping>
<class name="entities.Parent" table="parent" >
<id name="id" column="id" unsaved-value="-1" type="long">
<generator class="native"/>
</id>
<property name="name" />
<set name="children" inverse="true" cascade="all">
<key column="parent_id" not-null="true" />
<one-to-many class="entities.Child" />
</set>
</class>
</hibernate-mapping>
and Child:
Code:
<hibernate-mapping>
<class name="entities.Child" table="child">
<id name="id" column="id" unsaved-value="-1" type="long">
<generator class="native"/>
</id>
<property name="name" />
<property name="parent_id" not-null="true" />
</class>
</hibernate-mapping>
When I load a Parent all works fine, and hibernate populates all the Child Objects associated with the Parent, and adds them to the HashSet.
But when I try to create a new Parent and add new Children to the Parent, I get the following error:
Code:
org.hibernate.exception.ConstraintViolationException: could not insert: [entities.Child]
and...
Caused by: java.sql.SQLException: Cannot add or update a child row: a foreign key constraint fails
Here's my Java Code for the parent and child classes:
Code:
package entities;
public class Child {
private String name = null;
private long id = -1;
private long parent_id= -1;
public long getParent_id() {
return parent_id;
}
public void setParent_id(long parent_id) {
this.parent_id = parent_id;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
package entities;
import java.util.Set;
public class Parent {
private String name = null;
private long id = -1;
private Set children = null;
public Set getChildren() {
return children;
}
public void setChildren(Set children) {
this.children = children;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
this is what I do when I try to create and save a new Parent with new Children:
Code:
Session session = SessionManager.getSessionFactory().getCurrentSession();
session.beginTransaction();
Parent p= new Parent();
p.setName("mom");
Child c = new Child();
c.setName("kid1");
p.setChildren(new HashSet());
p.getChildren().add(c);
session.save(p);
session.getTransaction().commit();
Apparently to me, Hibernate doesn't know the Parents id at the time of saving and therefore cant set the foreign key of the Parent_id in the Child table. But how to I tell Hibernate that it should update this foreign key?
This problem has been haunting me for days now, and I cant solve it on my own. Maybe someones got some helpful hints on how to solve this problem.