Hibernate Many-to-Many self join duplicate entries -
i try save graph database. consists simple class "tag" attribute. class may have parents , children.
after save root class, graph saved too, when node have 2 parents, these 2 parents duplicated in database.
here mapped node class:
@entity @table(name="acttest") public class activitytest { @id @column(name="id_activity") @generatedvalue private long idactivity; @column(name="tag") private string tag; @manytomany(cascade=cascadetype.all, fetch = fetchtype.eager ) @jointable(name="dependencies", joincolumns={@joincolumn(name="id_master")}, inversejoincolumns={@joincolumn(name="id_slave")}) private set<activitytest> nextactivities = new hashset<activitytest>(); @manytomany(mappedby="nextactivities", fetch = fetchtype.eager) private set<activitytest> previousactivities = new hashset<activitytest>(); (getters , setters) } here test class:
public static void main(string[] args) { session s; activitylist al = new activitylist(); al.addroot("a"); al.addnextactivity("a", "a1"); al.addnextactivity("a", "a2"); al.addnextactivity("a", "a3"); al.addnextactivity("a1", "b"); al.addnextactivity("a1", "ba12"); al.addnextactivity("a2", "ba12"); al.addnextactivity("b", "b1"); al.addnextactivity("b", "b2"); al.addnextactivity("b2", "b2.2"); s = connfactory.getsession(); s.begintransaction(); s.save( al.getroot() ); s.gettransaction().commit(); s.close(); } here wrapper list:
public class activitylist { private list<activitytest> activities; private activitytest root = null; public void addroot( string tag ) { if ( root == null ) { activitytest activity = new activitytest( tag ); activities.add(activity); root = activity; } } public activitylist() { activities = new arraylist<activitytest>(); } public void addnextactivity( string master, string next ) { activitytest newact = new activitytest( next ); activities.add(newact); ( activitytest act : activities ) { if ( act.gettag().equalsignorecase( master ) ) { act.getnextactivities().add( newact ); } } } public activitytest getroot() { return root; } public list<activitytest> getactivities() { return activities; } public void setactivities( list<activitytest> activities ) { root = null; this.activities = activities; ( activitytest act : activities ) { if ( act.getpreviousactivities().size() == 0 ) { root = act; break; } } } } the graph design test:

the graph table:

and dependency table:

note duplicity of "ba12" node: onde "a1" child , other "a2" child.
how can make 1 instance of "ba12" node?
sorry all!
solved changing wrapper class:
added private method search created object:
private activitytest getactivity( string tag ) { ( activitytest act : activities ) { if ( act.gettag().equalsignorecase( tag ) ) { return act; } } return new activitytest(tag); } and changed addnextactivity to:
public void addnextactivity( string master, string next ) { activitytest newact = getactivity( next ); activities.add(newact); ( activitytest act : activities ) { if ( act.gettag().equalsignorecase( master ) ) { act.getnextactivities().add( newact ); } } } sorry again. mistake.
Comments
Post a Comment