@ManyToMany JoinTable updating problem

360 views
Skip to first unread message

Saulius

unread,
Jan 14, 2012, 2:50:09 PM1/14/12
to Ebean ORM
Hi all,

So I've changed all my @OneToMany @JoinTable fields (as they are not
supported by Ebean) to @ManyToMany @JoinTable fields. Saving entity
once works OK now, but just when you try to save it next time - it
fails - it is trying to add the same child entities again.

Here are some examples: I have entities Car (http://pastie.org/
3185458) and Wheel (http://pastie.org/3185466). As you can see Car has
ManyToMany relation to Wheel and a JoinTable to represent that
relation. Note in fact it should be OneToMany relation (as I also have
Bike and other stuff that has wheels).

I am using this DB scheme: http://pastie.org/3185484

So when I try to run this simple code:

Wheel w1 = new Wheel();
Wheel w2 = new Wheel();

List<Wheel> wheels = new LinkedList<Wheel>();
wheels.add(w1);
wheels.add(w2);

Car car = new Car();
car.setWheels(wheels);

Ebean.save(car);
Ebean.save(car);

And it fails with an exception:

avax.persistence.PersistenceException:
org.postgresql.util.PSQLException: ERROR: duplicate key value violates
unique constraint "pk_car_wheels"
Detail: Key (car, wheel)=(121, 101) already exists.
at
com.avaje.ebeaninternal.server.persist.ExeUpdateSql.execute(ExeUpdateSql.java:
95)
at
com.avaje.ebeaninternal.server.persist.DefaultPersistExecute.executeSqlUpdate(DefaultPersistExecute.java:
144)
at
com.avaje.ebeaninternal.server.core.PersistRequestUpdateSql.executeNow(PersistRequestUpdateSql.java:
63)
at
com.avaje.ebeaninternal.server.core.PersistRequest.executeStatement(PersistRequest.java:
93)
at
com.avaje.ebeaninternal.server.core.PersistRequestUpdateSql.executeOrQueue(PersistRequestUpdateSql.java:
68)
at
com.avaje.ebeaninternal.server.persist.DefaultPersister.executeSqlUpdate(DefaultPersister.java:
166)
at
com.avaje.ebeaninternal.server.persist.DefaultPersister.saveAssocManyIntersection(DefaultPersister.java:
1071)
at
com.avaje.ebeaninternal.server.persist.DefaultPersister.saveMany(DefaultPersister.java:
801)
at
com.avaje.ebeaninternal.server.persist.DefaultPersister.saveAssocMany(DefaultPersister.java:
711)
at
com.avaje.ebeaninternal.server.persist.DefaultPersister.update(DefaultPersister.java:
447)
at
com.avaje.ebeaninternal.server.persist.DefaultPersister.saveEnhanced(DefaultPersister.java:
343)
at
com.avaje.ebeaninternal.server.persist.DefaultPersister.saveRecurse(DefaultPersister.java:
315)
at
com.avaje.ebeaninternal.server.persist.DefaultPersister.save(DefaultPersister.java:
282)
at
com.avaje.ebeaninternal.server.core.DefaultServer.save(DefaultServer.java:
1642)
at
com.avaje.ebeaninternal.server.core.DefaultServer.save(DefaultServer.java:
1632)
at com.avaje.ebean.Ebean.save(Ebean.java:536)

So it seems it tries to add the same 2 Wheel objects to the join table
twice. Just for curiosity, I've tried removing primary key constraint
on join table and in fact it added the same values twice.

Looks like there is some sort of checking if the same entity is
already in the table missing.

Could someone with better knowledge of Ebean comment on this? How to
solve this problem?

Danillo

unread,
Jan 15, 2012, 8:18:26 AM1/15/12
to Ebean ORM
Try Ebean.saveManyToManyAssociations(car,"wheels")

I think Ebean.save() does not work well on ManyToMany associations

On 14 jan, 16:50, Saulius <saulius%pacekajus...@gtempaccount.com>
wrote:
Reply all
Reply to author
Forward
0 new messages