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:

enter image description here

the graph table:

enter image description here

and dependency table:

enter image description here

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

Popular posts from this blog

java - How to specify maven bin in eclipse maven plugin? -

single sign on - Logging into Plone site with credentials passed through HTTP -

php - Why does AJAX not process login form? -