Запросы на мягкое удаление Hibernate возвращают удаленных внуков ⇐ JAVA
Запросы на мягкое удаление Hibernate возвращают удаленных внуков
Во многих случаях в моем приложении я хочу вернуть дерево данных, используя отношения @OneToMany и @ManyToOne. Я реализую мягкое удаление с помощью @SQLDelete. @Где аннотации. Я не могу понять, как запретить дереву возвращать обратимо удаленные дочерние объекты.
Например, моя родительская сущность...
@Entity @Table(name = "gson_test_parent") @SQLDelete(sql = "ОБНОВЛЕНИЕ gson_test_parent SET удалено = true, delete_at = now() ГДЕ id=?") @Where(пункт = "удален = ложь") публичный класс GsonTestParent расширяет SoftDeletableEntity { общедоступная статическая окончательная строка STATUS_NEW = «новый»; общедоступная статическая окончательная строка STATUS_ACTIVE = «активный»; общедоступная статическая окончательная строка STATUS_DISABLED = «отключено»; @Разоблачать частное имя строки; @Разоблачать @OneToMany(fetch = FetchType.EAGER, mappedBy="gsonTestParentId") частный список gsonTestParentToGsonTestChild = новый ArrayList(); публичная строка getName() { вернуть имя; } public void setName (имя строки) { это.имя = имя; } общедоступный список getGsonTestParentToGsonTestChild() { вернуть gsonTestParentToGsonTestChild; } } ... моя сущность объединения...
@Entity @Table(name = "gson_test_parent_to_gson_test_child") @SQLDelete(sql = "ОБНОВЛЕНИЕ gson_test_parent_to_gson_test_child SET удалено = true, delete_at = now() ГДЕ id=?") @Where(пункт = "удален = ложь") общественный класс GsonTestParentToGsonTestChild расширяет SoftDeletableEntity { общедоступная статическая окончательная строка STATUS_ACTIVE = «активный»; общедоступная статическая окончательная строка STATUS_DISABLED = «отключено»; @Разоблачать частный длинный gsonTestParentId; @Разоблачать @Переходный @GsonExcludeBackReference частный GsonTestParent gsonTestParent; @Разоблачать @ManyToOne(fetch = FetchType.EAGER) @Where(пункт = "удален = ложь") частный GsonTestChild gsonTestChild; public Long getGsonTestParentId() { вернуть gsonTestParentId; } общественный GsonTestParent getGsonTestParent() { вернуть gsonTestParent; } public void setGsonTestParent(GsonTestParent gsonTestParent) { this.gsonTestParent = gsonTestParent; } общественный GsonTestChild getGsonTestChild() { вернуть gsonTestChild; } } ... и дочерний объект...
@Entity @Table(name = "gson_test_child") @SQLDelete(sql = "ОБНОВЛЕНИЕ gson_test_child SET удалено = true, delete_at = now() ГДЕ id=?") @Where(пункт = "удален = ложь") публичный класс GsonTestChild расширяет SoftDeletableEntity { общедоступная статическая окончательная строка STATUS_NEW = «новый»; общедоступная статическая окончательная строка STATUS_ACTIVE = «активный»; общедоступная статическая окончательная строка STATUS_DISABLED = «отключено»; @Разоблачать частное имя строки; публичная строка getName() { вернуть имя; } public void setName (имя строки) { это.имя = имя; } } К вашему сведению, все они расширяют SoftDeletableEntity, который выглядит как...
@MappedSuperclass публичный класс SoftDeletableEntity расширяет BaseEntity { общественный SoftDeletableEntity () { супер(); } @Разоблачать защищенная временная метка удаленаAt; защищенное логическое значение удалено = Boolean.FALSE; общественная отметка времени getDeletedAt() { вернуть удаленный At; } public void setDeletedAt (метка времени deleteAt) { this.deletedAt = deleteAt; } общедоступное логическое значение getDeleted() { возврат удален; } public void setDeleted (логическое значение удалено) { this.deleted = удалено; } } Когда я нахожу родительский объект...
@GetMapping(path="/{id}") public ResponseEntity get(@PathVariable Long id) выдает BaseException { Map responseMap = new HashMap(); GsonTestParent gsonTestParent = gsonTestParentService.find(id); responseMap.put("действие", "Получить"); responseMap.put("сообщение", "Объект получен"); responseMap.put("entityType", "GsonTestParent"); responseMap.put("entity", gsonTestParent); вернуть ответService.success(responseMap); } Я получаю дочерний объект (внук), хотя он помечен как удаленный в базе данных...
{ "полезная нагрузка": { "entityType": "GsonTestParent", "действие": "Получить", "message": "Объект получен", "сущность": { "имя": "test_parent_1", "gsonTestParentToGsonTestChild": [ { «gsonTestParentId»: 1, "gsonTestChild": { "name": "test_child_1", "deletedAt": "2022-07-26T04:31:30.000", "идентификатор": 1, "createAt": "2022-07-22T07:24:15.000", "updatedAt": "2022-07-22T07:24:15.000", "статус": "активен" }, «deletedAt»: ноль, "идентификатор": 1, "createAt": "2022-07-22T07:57:46.000", "updatedAt": "2022-07-22T07:57:46.000", "статус": "активен" } ], «deletedAt»: ноль, "идентификатор": 1, "createAt": "2022-07-22T07:23:15.000", "updatedAt": "2022-07-22T07:23:15.000", "статус": "активен" } }, "статус": "успех" } Запись gson_test_child в БД
mysql> select * from gson_test_child, где id = 1; +----+---------------------+---------------------+ ---------------------+---------+--------+--------- -----+ | идентификатор | создано_в | обновлено_в | удалено_в | удалено | статус | имя | +----+---------------------+---------------------+ ---------------------+---------+--------+--------- -----+ | 1 | 2022-07-22 14:24:15 | 2022-07-22 14:24:15 | 2022-07-26 11:31:30 | 1 | активный | test_child_1 | +----+---------------------+---------------------+ ---------------------+---------+--------+--------- -----+ Несколько комментариев:
[*]Я явно ссылаюсь на таблицу соединения, а не на использование функции @JoinTable, поскольку многие таблицы «объединения» в моем приложении имеют другие значимые поля, которые я хочу предоставить. [*]Я думал, что аннотация @Where в поле GsonTestParentToGsonTestChild.gsonTestChild исключит обратимо удаленные дочерние элементы, но, видимо, нет (или я делаю что-то неправильно). [*]Я знаю, что могу создавать явные собственные запросы JOIN FETCH в репозиториях, которые будут фильтровать удаленных внуков, но это как бы подрывает причины использования аннотаций.
Пожалуйста, дайте мне знать, если я могу предоставить дополнительную информацию.
Майк
Во многих случаях в моем приложении я хочу вернуть дерево данных, используя отношения @OneToMany и @ManyToOne. Я реализую мягкое удаление с помощью @SQLDelete. @Где аннотации. Я не могу понять, как запретить дереву возвращать обратимо удаленные дочерние объекты.
Например, моя родительская сущность...
@Entity @Table(name = "gson_test_parent") @SQLDelete(sql = "ОБНОВЛЕНИЕ gson_test_parent SET удалено = true, delete_at = now() ГДЕ id=?") @Where(пункт = "удален = ложь") публичный класс GsonTestParent расширяет SoftDeletableEntity { общедоступная статическая окончательная строка STATUS_NEW = «новый»; общедоступная статическая окончательная строка STATUS_ACTIVE = «активный»; общедоступная статическая окончательная строка STATUS_DISABLED = «отключено»; @Разоблачать частное имя строки; @Разоблачать @OneToMany(fetch = FetchType.EAGER, mappedBy="gsonTestParentId") частный список gsonTestParentToGsonTestChild = новый ArrayList(); публичная строка getName() { вернуть имя; } public void setName (имя строки) { это.имя = имя; } общедоступный список getGsonTestParentToGsonTestChild() { вернуть gsonTestParentToGsonTestChild; } } ... моя сущность объединения...
@Entity @Table(name = "gson_test_parent_to_gson_test_child") @SQLDelete(sql = "ОБНОВЛЕНИЕ gson_test_parent_to_gson_test_child SET удалено = true, delete_at = now() ГДЕ id=?") @Where(пункт = "удален = ложь") общественный класс GsonTestParentToGsonTestChild расширяет SoftDeletableEntity { общедоступная статическая окончательная строка STATUS_ACTIVE = «активный»; общедоступная статическая окончательная строка STATUS_DISABLED = «отключено»; @Разоблачать частный длинный gsonTestParentId; @Разоблачать @Переходный @GsonExcludeBackReference частный GsonTestParent gsonTestParent; @Разоблачать @ManyToOne(fetch = FetchType.EAGER) @Where(пункт = "удален = ложь") частный GsonTestChild gsonTestChild; public Long getGsonTestParentId() { вернуть gsonTestParentId; } общественный GsonTestParent getGsonTestParent() { вернуть gsonTestParent; } public void setGsonTestParent(GsonTestParent gsonTestParent) { this.gsonTestParent = gsonTestParent; } общественный GsonTestChild getGsonTestChild() { вернуть gsonTestChild; } } ... и дочерний объект...
@Entity @Table(name = "gson_test_child") @SQLDelete(sql = "ОБНОВЛЕНИЕ gson_test_child SET удалено = true, delete_at = now() ГДЕ id=?") @Where(пункт = "удален = ложь") публичный класс GsonTestChild расширяет SoftDeletableEntity { общедоступная статическая окончательная строка STATUS_NEW = «новый»; общедоступная статическая окончательная строка STATUS_ACTIVE = «активный»; общедоступная статическая окончательная строка STATUS_DISABLED = «отключено»; @Разоблачать частное имя строки; публичная строка getName() { вернуть имя; } public void setName (имя строки) { это.имя = имя; } } К вашему сведению, все они расширяют SoftDeletableEntity, который выглядит как...
@MappedSuperclass публичный класс SoftDeletableEntity расширяет BaseEntity { общественный SoftDeletableEntity () { супер(); } @Разоблачать защищенная временная метка удаленаAt; защищенное логическое значение удалено = Boolean.FALSE; общественная отметка времени getDeletedAt() { вернуть удаленный At; } public void setDeletedAt (метка времени deleteAt) { this.deletedAt = deleteAt; } общедоступное логическое значение getDeleted() { возврат удален; } public void setDeleted (логическое значение удалено) { this.deleted = удалено; } } Когда я нахожу родительский объект...
@GetMapping(path="/{id}") public ResponseEntity get(@PathVariable Long id) выдает BaseException { Map responseMap = new HashMap(); GsonTestParent gsonTestParent = gsonTestParentService.find(id); responseMap.put("действие", "Получить"); responseMap.put("сообщение", "Объект получен"); responseMap.put("entityType", "GsonTestParent"); responseMap.put("entity", gsonTestParent); вернуть ответService.success(responseMap); } Я получаю дочерний объект (внук), хотя он помечен как удаленный в базе данных...
{ "полезная нагрузка": { "entityType": "GsonTestParent", "действие": "Получить", "message": "Объект получен", "сущность": { "имя": "test_parent_1", "gsonTestParentToGsonTestChild": [ { «gsonTestParentId»: 1, "gsonTestChild": { "name": "test_child_1", "deletedAt": "2022-07-26T04:31:30.000", "идентификатор": 1, "createAt": "2022-07-22T07:24:15.000", "updatedAt": "2022-07-22T07:24:15.000", "статус": "активен" }, «deletedAt»: ноль, "идентификатор": 1, "createAt": "2022-07-22T07:57:46.000", "updatedAt": "2022-07-22T07:57:46.000", "статус": "активен" } ], «deletedAt»: ноль, "идентификатор": 1, "createAt": "2022-07-22T07:23:15.000", "updatedAt": "2022-07-22T07:23:15.000", "статус": "активен" } }, "статус": "успех" } Запись gson_test_child в БД
mysql> select * from gson_test_child, где id = 1; +----+---------------------+---------------------+ ---------------------+---------+--------+--------- -----+ | идентификатор | создано_в | обновлено_в | удалено_в | удалено | статус | имя | +----+---------------------+---------------------+ ---------------------+---------+--------+--------- -----+ | 1 | 2022-07-22 14:24:15 | 2022-07-22 14:24:15 | 2022-07-26 11:31:30 | 1 | активный | test_child_1 | +----+---------------------+---------------------+ ---------------------+---------+--------+--------- -----+ Несколько комментариев:
[*]Я явно ссылаюсь на таблицу соединения, а не на использование функции @JoinTable, поскольку многие таблицы «объединения» в моем приложении имеют другие значимые поля, которые я хочу предоставить. [*]Я думал, что аннотация @Where в поле GsonTestParentToGsonTestChild.gsonTestChild исключит обратимо удаленные дочерние элементы, но, видимо, нет (или я делаю что-то неправильно). [*]Я знаю, что могу создавать явные собственные запросы JOIN FETCH в репозиториях, которые будут фильтровать удаленных внуков, но это как бы подрывает причины использования аннотаций.
Пожалуйста, дайте мне знать, если я могу предоставить дополнительную информацию.
Майк
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение