JPA/hibernate - Cannot add or update a child row: a foreign key constraint fails. Can not insert null -
i'am trying implement manytomany relationship. works fine when getting data database entities fails when trying insert new value join table. have 3 tables: job, job_prozedur , prozedur. join table contains foreign keys parent tables (job , prozedur) , few columns.
the entity classes are:
@entity @table(name = "dok_job") public class job implements serializable { private static final long serialversionuid = 1l; private integer id; private string name; private list<jobprozedur> jobprozedurlist = new arraylist<jobprozedur>(); public job() {} @id @sequencegenerator(name="seqjob", sequencename="dok_seq_1", allocationsize=1) @generatedvalue(generator="seqjob") @column(name = "job_id") public integer getid() { return id; } public void setid(integer id) { this.id = id; } @column(name = "job_name") public string getname() { return name; } public void setname(string name) { this.name = name; } @onetomany(fetch = fetchtype.eager, mappedby = "job", cascade = cascadetype.all, orphanremoval=true) @orderby(value = "sortlnr") @cascade({org.hibernate.annotations.cascadetype.all}) public list<jobprozedur> getjobprozedurlist() { return jobprozedurlist; } public void setjobprozedurlist(list<jobprozedur> jobprozedurlist) { this.jobprozedurlist = jobprozedurlist; } @override public int hashcode() { final int prime = 31; int result = 1; result = prime * result + ((id == null) ? 0 : id.hashcode()); return result; } @override public boolean equals(object obj) { if (this == obj) return true; if (obj == null) return false; if (getclass() != obj.getclass()) return false; job other = (job) obj; if (id == null) { if (other.id != null) return false; } else if (!id.equals(other.id)) return false; return true; } } -
@entity @table(name = "dok_job_prozedur") public class jobprozedur implements serializable { private static final long serialversionuid = 7971463524201735449l; private jobprozedurid id = new jobprozedurid(); private integer sortlnr; private job job; private prozedur proz; public jobprozedur() {} @embeddedid public jobprozedurid getid() { return id; } public void setid(jobprozedurid id) { this.id = id; } @column(name = "sort_lnr") public integer getsortlnr() { return sortlnr; } public void setsortlnr(integer sortlnr) { this.sortlnr = sortlnr; } @manytoone(fetch=fetchtype.eager) @joincolumn(name = "job_id", referencedcolumnname = "job_id", insertable=false, updatable=false, nullable=false) public job getjob() { return job; } public void setjob(job job) { this.job = job; } @manytoone(fetch=fetchtype.eager) @joincolumn(name = "proz_id", referencedcolumnname = "proz_id", insertable=false, updatable=false) public prozedur getproz() { return proz; } public void setproz(prozedur proz) { this.proz = proz; } @override public int hashcode() { final int prime = 31; int result = 1; result = prime * result + ((id == null) ? 0 : id.hashcode()); return result; } @override public boolean equals(object obj) { if (this == obj) return true; if (obj == null) return false; if (getclass() != obj.getclass()) return false; jobprozedur other = (jobprozedur) obj; if (id == null) { if (other.id != null) return false; } else if (!id.equals(other.id)) return false; return true; } }
-
@embeddable public class jobprozedurid implements serializable { private static final long serialversionuid = 1l; private integer jobid; private integer prozid; public jobprozedurid() {} public jobprozedurid(integer jobid, integer prozid) { super(); this.jobid = jobid; this.prozid = prozid; } @column(name = "job_id", nullable=false) public integer getjobid() { return jobid; } public void setjobid(integer jobid) { this.jobid = jobid; } @column(name = "proz_id") public integer getprozid() { return prozid; } public void setprozid(integer prozid) { this.prozid = prozid; } @override public int hashcode() { final int prime = 31; int result = 1; result = prime * result + ((jobid == null) ? 0 : jobid.hashcode()); result = prime * result + ((prozid == null) ? 0 : prozid.hashcode()); return result; } @override public boolean equals(object obj) { if (this == obj) return true; if (obj == null) return false; if (getclass() != obj.getclass()) return false; jobprozedurid other = (jobprozedurid) obj; if (jobid == null) { if (other.jobid != null) return false; } else if (!jobid.equals(other.jobid)) return false; if (prozid == null) { if (other.prozid != null) return false; } else if (!prozid.equals(other.prozid)) return false; return true; } @override public string tostring() { return "jobprozedurid [jobid=" + jobid + ", prozid=" + prozid + "]"; } }
-
@entity @table(name = "dok_prozedur") public class prozedur implements serializable { private static final long serialversionuid = 1l; private integer id; private string dbname; private string schemaname; private string packagename; private string name; public prozedur() {} @id @sequencegenerator(name="seqproz", sequencename="dok_seq_1", allocationsize=1) @generatedvalue(generator="seqproz") @column(name = "proz_id") public integer getid() { return id; } public void setid(integer id) { this.id = id; } @column(name = "db_name") public string getdbname() { return dbname; } public void setdbname(string dbname) { this.dbname = dbname; } @column(name = "schema_name") public string getschemaname() { return schemaname; } public void setschemaname(string schemaname) { this.schemaname = schemaname; } @column(name = "package_name") public string getpackagename() { return packagename; } public void setpackagename(string packagename) { this.packagename = packagename; } @column(name = "proz_name") public string getname() { return name; } public void setname(string name) { this.name = name; } @override public int hashcode() { final int prime = 31; int result = 1; result = prime * result + ((id == null) ? 0 : id.hashcode()); return result; } @override public boolean equals(object obj) { if (this == obj) return true; if (obj == null) return false; if (getclass() != obj.getclass()) return false; prozedur other = (prozedur) obj; if (id == null) { if (other.id != null) return false; } else if (!id.equals(other.id)) return false; return true; } }
the part of code assign prozedur job , persist is:
// ... // ... jobprozedur jobproz = new jobprozedur(); jobproz.setjob(job); jobproz.setproz(proz); job.getjobprozedurlist().add(jobproz); entitymanager.persist(job); entitymanager.flush(); when persisting exception:
org.hibernate.exception.constraintviolationexception: ora-01400: cannot insert null ("dok"."dok_job_prozedur"."job_id") i don't know why hibernate doesn't assign values foreign keys columns in join table during persist. update works because assign values manually, not right way. appreciated. i've been working on few days , see no solution. please help!
you forgot add @mapsid annotation on jobprozedur.getproz() , jobprozedut.getjob()
edit: , @pepperbob says: associations shouldn't marked insertable=false , updatable=false, since precisely want insert them.
but make life easier, , application faster, using single-column, auto-generated primary key instead of composite primary key. use unique constraint guarantee 2 rows same job id , same prozedur id can't exist.
Comments
Post a Comment