Wednesday 15 February 2012

java - Many to Many Hibernate mapping with extra column -



java - Many to Many Hibernate mapping with extra column -

i've seen question on here few times, none of answers prepare issue.

i'm trying deconstruct many-to-many relationship downwards seperate many-to-one , one-to-many entities can add together additional columns. have, main entity saves database, intermediate not. if can figure out what's going on much appreciate it. tried doing other way primary key composite (aka: @associationoverride) did not work. i've scowered web cannot find reply issue here.

this main entity, maintorder:

@entity @table(name="maint_orders") public class maintorder extends persistedobject implements java.io.serializable { ... @onetomany(cascade = cascadetype.all, mappedby="maintorder") private set<manpowerline> manpower = new hashset<manpowerline>() ; public void addmanpower(manpower manpower, integer quantity, float price) { manpowerline mpline = new manpowerline(); mpline.setmanpower(manpower); mpline.setmaintorder(this); mpline.setmanpowerid(manpower.getmanpowerid()); mpline.setmaintorderid(this.getmaintorderid()); mpline.setquantity(quantity); mpline.setprice(price); this.manpower.add(mpline); // add together association object employee. manpower.getmaintorder().add(mpline); } ... getters , setters }

here secondary entity, manpower:

@entity @table(name="man_power") public class manpower extends persistedobject implements java.io.serializable { ...id's, etc @onetomany(mappedby="manpower", fetch = fetchtype.eager) private set<manpowerline> maintorder = new hashset<manpowerline>(); public set<manpowerline> getmaintorder(){ homecoming maintorder; } public void setmaintorder(set<manpowerline> maintorder){ this.maintorder = maintorder; } ... other getters , setters }

here intermediate entity, manpowerline:

@entity @table(name = "man_power_line") @idclass(manpowerlineid.class) public class manpowerline extends persistedobject implements java.io.serializable { @id private long maintorderid; @id private long manpowerid; @column(name="quantity") private integer quantity; @column(name="price") private float price; @manytoone @joincolumn(name = "maintorderid", updatable = false, insertable = false, referencedcolumnname = "maint_order_id") private maintorder maintorder; @manytoone @joincolumn(name = "manpowerid", updatable = false, insertable = false, referencedcolumnname = "man_power_id") private manpower manpower; ... other getters , setters }

and id entity, manpowerlineid:

public class manpowerlineid implements java.io.serializable { private long maintorderid; private long manpowerid; public long getmaintorderid(){ homecoming maintorderid; } public long getmanpowerid(){ homecoming manpowerid; } public void setmaintorderid(long maintorderid){ this.maintorderid = maintorderid; } public void setmanpowerid(long manpowerid){ this.manpowerid = manpowerid; } @override public int hashcode(){ homecoming (int)(maintorderid + manpowerid); } @override public boolean equals(object obj) { if( obj instanceof manpowerline){ manpowerlineid otherid = (manpowerlineid)obj; boolean hey = (otherid.maintorderid == this.maintorderid) && (otherid.manpowerid == this.manpowerid); homecoming hey; } homecoming false; } }

finally code utilizes follows:

private void insertobject( ) { servicelocator locator = new servicelocator(); sessionfactory sf = locator.gethibernatesessionfactory(); session sess = sf.opensession(); transaction tx = sess.begintransaction(); maintorder m = new maintorder(); ... various setters m set manpowerset = new hashset(); for(int = 0; < manpowerset.size(); i++){ manpower mp = new manpower(); mp = (manpower) manpowerset.iterator().next(); m.addmanpower(mp, quantity, cost); } sess.saveorupdate(m); tx.commit(); sess.close(); }

is possible need utilize more m.addmanpower add together line? i've tried adding m.setmanpowerline, not alter result.

anyways know lot of code at, in advance.

turns out fixed own issue on one. problem didn't set cascade = cascadetype.all, in all right places. here:

@onetomany(mappedby="manpower", fetch = fetchtype.eager) private list<manpowerline> maintorder = new arraylist<manpowerline>();

should be:

@onetomany(mappedby="manpower", cascade = cascadetype.all) private list<manpowerline> maintorder = new arraylist<manpowerline>();

java hibernate many-to-many model-associations

No comments:

Post a Comment