Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[eclipselink-users] Setting both sides of many-to-many relationship causes double-insert

Hello.

Before I take the time to provide my situation as a standalone
example, I decided I'd better ask what the expected behavior is.  I'm
condensing things down and simplifying -- not my actual code.

We have a many-to-many join table set up between service and order:

@IdClass(ServiceOrderJoinPK.class)
@MappedSuperclass
@Table(name="service_order_join")
public class ServiceOrderJoin ... {
    @Id // first half of primary key
    @Column(name="service_id")
    private Long serviceId = null;
    @Id // second half of primary key
    @Column(name="order_id")
    private Long orderId = null;

public class Order {
    @ManyToMany(targetEntity=Service.class, fetch=FetchType.LAZY)
    @JoinTable (
        name="service_order",
        joinColumns=@JoinColumn(name="order_id", referencedColumnName="id"),
        inverseJoinColumns=@JoinColumn(name="service_id",
referencedColumnName="id")
    )
    private List<Service> serviceList = null; // with standard accessors

[...Same pattern for class Service...]


This is the pseudo-code to cause the behavior we're seeing under
EclipseLink 1.0.2:

- create order object
- fetch service object from database
- order.addToServiceList(service)
- service.addToOrderList(order);
- commit

And here's our problem: double-insert.

INSERT INTO service_order_join (service_id, order_id)
VALUES (2, 1000)

INSERT INTO service_order_join (order_id, service_id)
VALUES (1000, 2)

[EL Warning]: 2009.06.16
20:20:35.437--UnitOfWork(100365669)--Thread(Thread[main,5,main])--Exception
[EclipseLink-4002] (Eclipse Persistence Services - 1.0.2 (Build
SNAPSHOT-20090505)):
org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: org.h2.jdbc.JdbcSQLException: Unique index or
primary key violation: PRIMARY_KEY_A24  ON
SERVICE_ORDER_JOIN(SERVICE_ID, ORDER_ID); SQL
statement: INSERT INTO service_order (order_id, service_id)
VALUES (?, ?) [23001-111]

Thanks for your time.

Regards,
Mike


Back to the top