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

Popular posts from this blog

.htaccess - First slash is removed after domain when entering a webpage in the browser -

Automatically create pages in phpfox -

c# - Farseer ContactListener is not working -