JPA обновляет множество удаляющих записей - PullRequest
2 голосов
/ 17 августа 2010

У меня есть отношения @ManyToMany между двумя объектами.Когда я выполняю обновление на стороне владельца, кажется, что JPA удаляет все связанные записи из моей базы данных и повторно вставляет их.Для меня это проблема, потому что у меня есть триггер MySQL, который срабатывает до удаления записи.Любые идеи о том, как обойти эту проблему?

@Entity
public class User {

    @Id
    @Column(name="username")
    private String username;

    ...

    @ManyToMany
    @JoinTable(name="groups", joinColumns=
        @JoinColumn(name="username", referencedColumnName="username"),
            inverseJoinColumns=@JoinColumn(name="groupname",
                    referencedColumnName="type_id"))
    private List<UserType> types;

    ...

}

@Entity
public class UserType {

    @Id
    @Column(name="type_id")
    private String id;

    @ManyToMany(mappedBy="types")
    private List<User> users;

    ...
} 

Ответы [ 4 ]

3 голосов
/ 23 октября 2017

Использование Set вместо List решило проблему. Но я понятия не имею, почему это работает.

Другое решение, предоставляемое Hibernate, состоит в разделении ассоциации @ManyToMany на два двунаправленных отношения @OneTo@Many. См., Например, документацию по Hibernate 5.2 .

Если двунаправленная @OneToMany ассоциация работает лучше, когда удаляя или изменяя порядок дочерних элементов, @ManyToMany отношения не могут извлечь выгоду из такой оптимизации, потому что сторона внешнего ключа не находится под контролем. Чтобы преодолеть это ограничение, таблица ссылок должна быть открыта напрямую и ассоциация @ManyToMany разделить на две двунаправленные @OneToMany взаимосвязи.

1 голос
/ 18 августа 2010

Попробуйте это:

1) изменить объявление на:

private List<UserType> types = new Vector<UserType>();

2) никогда не звонить

user.setTypes(newTypesList)

3) только звонить

user.getTypes().add(...);
user.getTypes().remove(...);
1 голос
/ 17 августа 2010

Вероятно, это связано с вопросом . Вы должны убедиться, что у вас есть правильно определенный hashCode метод equals в вашем отображенном объекте, чтобы Eclipselink мог определить равенство и, таким образом, определить, что существующие объекты отображаются в существующие объекты в БД. В противном случае у него нет другого выбора, кроме как каждый раз воссоздавать дочерние объекты.

Кроме того, я читал, что такое объединение может поддерживать эффективное добавление и удаление элементов списка, только если вы используете столбец индекса, но это будет зависеть от EclipseLink, поскольку аннотации JPA, похоже, не поддерживают такие вещь. Я знаю, что есть эквивалентная аннотация Hibernate, но я не знаю, что было бы в Eclipselink, если такая вещь существует.

0 голосов
/ 18 августа 2010

Похоже, моя проблема заключалась в том, что я не сливал сущность.

...