Как удалить объект с отношениями ManyToMany в JPA (и соответствующие строки объединяющей таблицы)?

Еще один способ:

:'<,'>g/^/norm I//

/^/ - просто фиктивный шаблон для соответствия каждой строке. norm позволяет вам запускать команды нормального режима, которые следуют. I// говорит, что нужно войти в режим вставки, переместив курсор в начало строки, а затем вставить следующий текст (две косые черты).

:g часто удобно делать что-то сложное в нескольких строках, где вы можете переключаться между несколькими режимами, удалять или добавлять строки, перемещать курсор вокруг, запускать несколько макросов и т. Д. может сказать, что он работает только на линиях, которые соответствуют шаблону.

81
задан rdk 8 April 2013 в 19:16
поделиться

2 ответа

  • Право собственности на отношение определяется тем, где вы помещаете атрибут 'mappedBy' в аннотацию. Сущность, которую вы указали mappedBy, НЕ является владельцем. У обеих сторон нет шансов стать собственниками. Если у вас нет варианта использования «удалить пользователя», вы можете просто передать право собственности объекту Group , поскольку в настоящее время владельцем является Пользователь .
  • На странице С другой стороны, вы не спрашивали об этом, но кое-что стоит знать. Группы и пользователи не объединяются друг с другом. Я имею в виду, что после удаления экземпляра User1 из Group1.users коллекции User1.groups не изменяются автоматически (что для меня довольно удивительно)
  • В общем, я предлагаю вам решить, кто является владельцем. Допустим, владелец Пользователь . Затем при удалении пользователя соответствующая группа пользователей будет обновлена ​​автоматически. Но при удалении группы вы должны сами позаботиться об удалении отношения следующим образом:

entityManager.remove(group)
for (User user : group.users) {
     user.groups.remove(group);
}
...
// then merge() and flush()
78
ответ дан 24 November 2019 в 09:37
поделиться

Я нашел возможное решение, но... не знаю, хорошее ли это решение.

@Entity
public class Role extends Identifiable {

    @ManyToMany(cascade ={CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH})
    @JoinTable(name="Role_Permission",
            joinColumns=@JoinColumn(name="Role_id"),
            inverseJoinColumns=@JoinColumn(name="Permission_id")
        )
    public List<Permission> getPermissions() {
        return permissions;
    }

    public void setPermissions(List<Permission> permissions) {
        this.permissions = permissions;
    }
}

@Entity
public class Permission extends Identifiable {

    @ManyToMany(cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH})
    @JoinTable(name="Role_Permission",
            joinColumns=@JoinColumn(name="Permission_id"),
            inverseJoinColumns=@JoinColumn(name="Role_id")
        )
    public List<Role> getRoles() {
        return roles;
    }

    public void setRoles(List<Role> roles) {
        this.roles = roles;
    }

Я попробовал это, и это работает. Когда вы удаляете роль, также удаляются отношения (но не объекты разрешений), а когда вы удаляете разрешения, отношения с ролью также удаляются (но не экземпляр роли). Но мы отображаем однонаправленное отношение два раза, и оба объекта являются владельцами отношения. Может ли это вызвать некоторые проблемы со спящим режимом? Какие проблемы?

Спасибо!

Приведенный выше код взят из другого сообщения.

26
ответ дан 24 November 2019 в 09:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: