java - How to move items between collections in Hibernate 4.3.7.Final -


i have 2 entities mapped in application in order model team , members. team can have many members , member can belong no more 1 team. fine handling concepts. problem comes when try move member 1 existing team another.

the entities presented below, in simplified form. last method, transfer(), 1 should perform removal of member team , send one.

@entity public class member extends person {     @manytoone     private team team;      protected member() {         super();     }      public member(team team, string name) {         super(name);         this.team = team;     }      // trivial getters , setters...      public team getteam() {         return team;     }      protected void setteam(team team) {         this.team = team;     } }  @entity public class team {     @id     private long id;     private string name;     @onetomany(mappedby="team", cascade=cascadetype.all)     private list<member> members = new arraylist<member>();      protected team() {     }      public team(string name) {         this.name = name;     }      // trivial getters , setters...      public member addmember(string name) {         member member = new member(this, name);          members.add(member);         return member;     }      protected void addmember(member member) {         members.add(member);         member.setteam(this);     }      public void removemember(member member) {         members.remove(member);     }      public member memberbyname(string membername) {         for(member member : members)           if(member.getname().equals(membername))               return member;         return null;     }      public collection<members> getmembers() {         return collections.unmodifiablecollection(members);     }      public void transfer(member member, team destination) {         members.remove(member);         destination.addmember(member);     } } 

i have unit test code intended validate transfer service

team teama = teamrepository.teambyid(idteama); team teamb = teamrepository.teambyid(idteamb); team teamc = teamrepository.teambyid(idteamc);  member zaki = teama.memberbyname("zaki"); member denise = teama.memberbyname("denise");  entitytransaction t = teamrepository.transactionbegin(); teama.transfer(zaki, teamb); teama.transferir(denise, teamc); t.commit(); 

i have following exception in commit() line

javax.persistence.persistenceexception: org.hibernate.persistentobjectexception: detached entity passed persist: application.domain.member 

any ideas?

update 1:

i decided perform little test , changed code of transfer() method follows

public void transfer(member member, team destination) {     member.setteam(this); } 

the result curious: no error, no update on tables. hibernate couldn't track update , transfer didn't happen.

update 2:

i decided give try on suggestion steve k , changed transfer() method following:

    public void transfer(member member, team destination) {         destination.addmember(member);         members.remove(member);     } 

looking addmember() , removemember() methods (below) see team begin updated too.

    protected void addmember(member member) {         members.add(member);         member.setteam(this);     }      public void removemember(member member) {         members.remove(member);     } 

so, member being added destination collection, team being set destination team , member being removed current collection (current team).

the test case changed to

entitytransaction t = teamrepository.transactionbegin(); teama.transfer(zaki, teamb); teama.getentitymanager().refresh(teama); // exception here!!! t.commit(); 

in refresh() line have following exception:

javax.persistence.persistenceexception: org.hibernate.persistentobjectexception: detached entity passed persist: domain.member     @ org.hibernate.jpa.spi.abstractentitymanagerimpl.convert(abstractentitymanagerimpl.java:1763)         // ... many calls     @ org.eclipse.jdt.internal.junit.runner.remotetestrunner.main(remotetestrunner.java:192) caused by: org.hibernate.persistentobjectexception: detached entity passed persist: domain.member     @ org.hibernate.event.internal.defaultpersisteventlistener.onpersist(defaultpersisteventlistener.java:139)         // ... many calls     @ org.hibernate.jpa.spi.abstractentitymanagerimpl.flush(abstractentitymanagerimpl.java:1335)     ... 28 more 

it seems, after all, transfering instances 1 collection (that implementing simple aggregation) not supported in hibernate!

moving member 1 list other not going change team value. better idea directly change team b in member entity.


Comments

Popular posts from this blog

java - Oracle EBS .ClassNotFoundException: oracle.apps.fnd.formsClient.FormsLauncher.class ERROR -

c# - how to use buttonedit in devexpress gridcontrol -

nvd3.js - angularjs-nvd3-directives setting color in legend as well as in chart elements -