как определить обратное каскадное удаление на many-one, отображающемся в, в спящем режиме

Я нашел это на PIClist о алгоритм Сортировочной станции :

записи Harold:

я не забываю читать, давным-давно, алгоритма, который преобразовал алгебраические выражения в RPN для легкой оценки. Каждое инфиксное значение или оператор или круглая скобка были представлены железнодорожным вагоном на дорожке. Один тип автомобиля отделен к другой дорожке и другое длительное прямо вперед. Я не вспоминаю детали (очевидно!), но всегда думал, что будет интересно кодировать. Это вернулось, когда я писал 6800 (не 68000) ассемблерный код.

Это - "алгоритм сортировочной станции", и это - то, что использует большинство синтаксических анализаторов машины. См. статью о парсинге в Википедии. Простой способ кодировать алгоритм сортировочной станции состоит в том, чтобы использовать два стека. Каждый - стопка "нажатия" и другой стопка "уменьшения" или "результата". Пример:

pstack = ()//пустой rstack = () вход: 1+2*3 приоритета = 10//самый низкий уменьшают = 0//, не уменьшают

, запустите: маркер '1': isnumber, вставленный в pstack (нажатие) маркер '+ ': isoperator устанавливают precedence=2 если приоритет < previous_operator_precedence тогда уменьшают ()//, посмотрите ниже помещенного '+' в pstack (нажатие) маркер '2': isnumber, вставленный в pstack (нажатие) маркер '* ': isoperator, набор precedence=1, вставленный в pstack (нажатие)//проверяют приоритет как//выше маркера '3': isnumber, вставленный в pstack (нажатие) конец входа, должен уменьшить (целью является пустой pstack), уменьшают ()//сделанный

, чтобы уменьшить, вытолкать элементы от стопки нажатия и поместить их в стопку результата, всегда подкачивать лучшие 2 объекта на pstack, если они имеют 'оператор' формы 'число':

pstack: '1' '+' '2'' ' '3' rstack: ()... pstack: () rstack: '3' '2'' ' '1' '+ '

, если выражение было бы:

1*2+3

тогда уменьшать триггер был бы чтением маркера '+', который имеет ниже precendece, чем '*' уже продвинутый, таким образом, это сделало бы:

pstack: '1'' ' '2' rstack: ()... pstack: () rstack: '1' '2'' '

и затем продвинутый '+' и затем '3' и затем наконец уменьшенный:

pstack: '+' '3' rstack: '1' '2'' '... pstack: () rstack: '1' '2'' ' '3' '+ '

, Таким образом, короткая версия: продвиньте числа, когда продвижение операторов проверит приоритет предыдущего оператора. Если это было выше, чем оператор, который должен быть продвинут теперь, сначала уменьшить, затем продвинуть текущий оператор. Для обработки parens просто сохраняют приоритет 'предыдущего' оператора и помещают метку на pstack, который говорит уменьшать алгоритму прекращать уменьшать при решении внутренней части paren пары. Закрытие paren инициировало сокращение, как делает конец входа, и также удаляет открытую метку paren из pstack и восстанавливает 'предыдущую операцию' приоритет, настолько анализирующий, может продолжиться после завершения paren, где это кончило. Это может быть сделано с рекурсией или без (подсказка: используйте стек для хранения предыдущего приоритета при обнаружении' ('...). Обобщенная версия этого должна использовать реализованный алгоритм сортировочной станции парсера-генератора, f.ex. использующий yacc или бизона или taccle (tcl аналог yacc).

Peter

-Adam

18
задан Brian Tompsett - 汤莱恩 4 July 2015 в 13:10
поделиться

2 ответа

Hibernate только каскадирует по определенным ассоциациям. Если A ничего не знает о B, ничто из того, что вы делаете с A, не повлияет на B.

Поэтому предложение Паскаля - это самый простой способ сделать то, что вы хотите:

<class name="A" table="tbl_A">
  ...
  <set name="myBs" inverse="true" cascade="all,delete-orphan">
    <key column="col1"/>
    <one-to-many class="B"/>
  </set>
</class>

<class name="B" table="tbl_B">
  ...
  <many-to-one name="a" class="A" column="col1" not-null="true"/>
</class>

Обратите внимание, что установка cascade = "delete" на B в том виде, в каком он есть в исходном коде, НЕ будет делать то, что вы хотите - он сообщает Hibernate «удалить A, если B удален», что может привести к нарушению ограничения (если есть другие Bs, связанные с этим A).

Если вы абсолютно не можете добавить коллекцию Bs в A (хотя я действительно не могу вспомнить обстоятельства, при которых это было бы так), ваша единственная другая альтернатива - определить каскадное удаление от A до B на уровне внешнего ключа; ваши B будут удалены, когда будет удален ваш A.

Это довольно уродливое решение, потому что вы должны быть очень осторожны при удалении A в Hibernate:

  1. Сессия должна быть очищена до удаления A (наличие ожидающих обновлений для B может привести к ошибке или A и некоторые B повторно вставляются за кулисами)
  2. Все B, связанные с вашим A (и поскольку вы не поддерживаете отношения со стороны A, это означает, что все B) должны быть исключены из всех активные сеансы и кэш 2-го уровня.
24
ответ дан 30 November 2019 в 07:55
поделиться

Я думаю, вам нужно cascade = "all, delete-orphan" от A до B с ассоциацией один-ко-многим .

7
ответ дан 30 November 2019 в 07:55
поделиться
Другие вопросы по тегам:

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