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
Post a Comment