SpringBoot Data - Как удалить все строки, которые имеют идентификатор? - PullRequest
0 голосов
/ 05 сентября 2018

Допустим, у меня есть таблица под названием «ПОЛЬЗОВАТЕЛЬ». В этой таблице у меня есть все пользовательские данные, и я назначаю пользователю уникальный идентификатор, и поэтому каждая строка уникальна.

Это выглядит примерно так:

@Entity
@Table(name = "USER")
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "id_seq")
    @Column(name = "USER_ID")
    private Long userId;

    @Column(name = "FRST_NAME")
    private String firstName;

    @Column(name = "LAST_NAME")
    private String lastName;

    ... a lot more stuff ...

}

У меня также есть другая таблица, в которой я назначаю все роли, которые есть у пользователя, и выглядит каждая строка:

@Entity
@Table(name = "USER_ROLES")
public class UserRoleMap {

    @Id
    @Column(name = "USER_ID")
    Long userId;

    @Column(name = "USER_ROLE_ID")
    Long userRoleId;

    @Column(name = "UPDATED_DATE")
    String updatedDate;

    @Column(name = "UPDATED_BY")
    String updatedBy;

}

Эта таблица не имеет явного уникального ключа. Данные могут легко выглядеть следующим образом, где 12278 - уникальный идентификатор пользователя.

12,278  8,420   pretend_timestamp   admin_user
12,278  8,430   pretend_timestamp   admin_user
12,278  8,476   pretend_timestamp   admin_user
12,278  8,478   pretend_timestamp   admin_user
12,278  18,578  pretend_timestamp   admin_user
12,278  8,482   pretend_timestamp   admin_user
12,278  18,539  pretend_timestamp   admin_user

Так как мне сделать следующее с помощью идиоматической пружинной загрузки?

DELETE USER_ROLES where USER_ID = 12278

Я пробовал следующее, но spring-boot выдает ошибку:

userRoleRepository.deleteById(user.getUserId); 

дает

org.hibernate.jdbc.BatchedTooManyRowsAffectedException: Batch update returned unexpected row count from update

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

На вашем UserRoleRepository интерфейсе попробуйте следующее: void deleteAllByUserId(Long userId); и затем вызовите это в своей служебной логике.

0 голосов
/ 05 сентября 2018

Насколько мне известно, дизайн вашей UserRoleMap сущности неправильный, поскольку вы упоминаете userId в качестве идентификатора (это означает первичный ключ). Таким образом, всегда требуется, чтобы ваша userId была уникальный для каждой строки в таблице USER_ROLES (что является функцией первичного ключа).

По моему мнению, вы, возможно, не определяете userId как первичный ключ в ваших табличных сценариях при создании таблицы, и вы могли вставить данные через запросы вставки в базу данных, а не через spring-data-jpa.

Теперь в вашем spring-data-jpa, когда вы пытаетесь deleteById, он ожидает найти только одну строку и удалить (потому что вы упомянули @Id для userId), но так как в вашей таблице несколько строк с тем же userId вы сталкиваетесь с вышеуказанным исключением.

Наилучшим возможным решением было бы создание правильного первичного ключа в таблице USER_ROLES (может быть составной первичный ключ userId и roleId)

или удалить через HQL

(delete from UserRoleMap where userId =:userID).

Но в идеале при использовании ORM уникальный первичный ключ в вашей таблице сопоставления совершенно необходим, иначе вы можете столкнуться с большим количеством проблем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...