Spring JPA OneToOne FK в виде каскада ПК. Удаление

Похоже, эта ошибка может возникнуть, если отсутствует файл DICOM ImageOrientationPatient, ImagePositionPatient или PixelSpacing. Без них никакая программа не сможет определить правильную геометрию вашего тома.

См. https://github.com/canlab/spm12/blob/master/spm_dicom_convert.m# L1403 для ошибки кода.

Если у вас есть расширенный файл MR, может потребоваться преобразовать его в серию устаревших МР-изображений (вы можете попробовать MRIConvert или другой инструмент для этого). Я не знаком с SPM, поэтому я не знаю, поддерживается ли Enhanced MR, но, конечно же, будет серия стандартных МР-изображений.

2
задан Andronicus 6 February 2019 в 18:56
поделиться

5 ответов

Чтобы добиться того, что вы просили, я настроил ваши таблицы следующим образом:

    CREATE TABLE b (
       dbid INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY
    );

    CREATE TABLE a ( 
       b_id int(11) NOT NULL PRIMARY KEY REFERENCES b(dbid) ON DELETE CASCADE
    );

CASCADE DELETE не было добавлено в ваш DDL.

Это включит каскадное удаление. Чтобы удалить запись b об удалении a, я сделал следующие изменения в классе A:

@Entity
@Table(name = "a")
public class A {

    @Id
    @Column(name = "b_id")
    @GeneratedValue(generator = "gen")
    @GenericGenerator(name = "gen", strategy = "foreign", parameters = @Parameter(name="property", value="b"))
    private Integer bId;

    @OneToOne(cascade = CascadeType.REMOVE, orphanRemoval = true)
    @PrimaryKeyJoinColumn
    private B b;
}

Это сработало хорошо. Я надеюсь, что это помогает.

Найдите здесь ссылку на рабочее решение .

0
ответ дан Nisheeth Shah 6 February 2019 в 18:56
поделиться

попробуйте с кодом ниже -

@OneToOne(mappedBy = "b",cascade = CascadeType.ALL,fetch = FetchType.LAZY,orphanRemoval=true )
private A a;
0
ответ дан Narendra Pandey 6 February 2019 в 18:56
поделиться

С точки зрения только стороны MySQL вашей реализации записи в таблице B не имеют «знания» о какой-либо записи в таблице A. В базе данных связь является однонаправленной

Встроенная каскадная функциональность существует для предотвращения ошибок внешнего ключа, указав БД, что делать при удалении записи, внешний ключ не будет указывать никуда. Удаление записи таблицы A не приведет к ошибке внешнего ключа ни в одной записи таблицы B, поэтому любые функции собственного каскада не сработают

Повторение; Вы не можете сохранить схему такой же, и каскадное удаление из a в b, потому что у вас нет каскадного удаления из a в b

[1113 ] Вы также упомянули в комментариях, что некоторые записи таблицы B могут существовать без записей таблицы A, чего нет в исходном вопросе

Чтобы получить автоматическое удаление описанных вами записей таблицы B, у вас есть несколько вариантов Что касается БД:

  1. Поменяйте местами отношение через - Удалите текущий внешний ключ и добавьте столбец внешнего ключа, который можно обнулять, в таблице B, который ссылается на первичный ключ таблицы A. Затем вы можете поместить каскадное удаление в этот внешний ключ. Оставьте новый столбец пустым для записей таблицы B, которые не принадлежат записи таблицы A. Вы также можете добавить уникальный индекс в этот столбец для защиты отношения один-к-одному
  2. Добавить триггер БД - При удалении записи таблицы A добавьте триггер БД, который удаляет ссылку запись таблицы B
  3. Добавление процедуры БД - добавление процедуры, которая удаляет запись таблицы A, а затем, по очереди, ссылку на запись таблицы B, возможно, в рамках транзакции. В дальнейшем удаляем только записи таблицы А, используя процедуру
  4. . Не решайте проблему на уровне БД - в основном то же, что и в варианте 3, но перемещайте логику процедуры из БД. слой в логику приложения

Может быть что-то в JPA, что решает вашу дилемму из коробки, но под капотом это будет делать одно из перечисленных выше (не вариант 1, а, вероятно, вариант 4)

0
ответ дан Arth 6 February 2019 в 18:56
поделиться

Если вы хотите удалить объект из B, всякий раз, когда удаляется связанный A (это четвертый пункт вашего списка желаний:

Я хочу каскадное удаление, которое удаляет связанный [ 113] когда a удалено

, вам нужно изменить отображение в A на:

@OneToOne(cascade = CascadeType.REMOVE, orphanRemoval = true)
@PrimaryKeyJoinColumn
private B b;
0
ответ дан Andronicus 6 February 2019 в 18:56
поделиться

Можете ли вы попробовать в классе B добавить следующее

@OneToOne(mappedBy = "b", cascade = CascadeType.REMOVE)
private A a;

Кроме того, если в базе данных у вас есть только внешний ключ «a имеет внешний ключ к b», вы также можете сделать внешний ключ от б до а.

0
ответ дан Periklis Douvitsas 6 February 2019 в 18:56
поделиться
Другие вопросы по тегам:

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