Наследование с помощью Java и Hibernate - приведение типов при обновлении

Что такое sh

sh (или командный язык командной оболочки) - это язык программирования, описанный стандартом POSIX . Он имеет множество реализаций (ksh88, dash, ...). bash также можно рассматривать как реализацию sh (см. ниже).

Поскольку sh является спецификацией, а не реализацией, /bin/sh является символической ссылкой (или жесткой ссылкой) на фактическая реализация на большинстве систем POSIX.

Что такое bash

bash началось как sh -совместимая реализация (хотя она предшествует стандарту POSIX на несколько лет) но со временем он приобрел много расширений. Многие из этих расширений могут изменять поведение действительных сценариев оболочки POSIX, поэтому сам по себе bash не является допустимой оболочкой POSIX. Скорее, это диалект языка оболочки POSIX.

bash поддерживает переключатель --posix, что делает его более совместимым с POSIX. Он также пытается имитировать POSIX, если он вызван как sh.

sh = bash?

Долгое время /bin/sh указывал на /bin/bash на большинстве GNU / Linux. В результате было почти безопасно игнорировать разницу между ними. Но в последнее время это изменилось.

Некоторые популярные примеры систем, в которых /bin/sh не указывают на /bin/bash (а некоторые из которых /bin/bash могут даже не существовать):

  1. Современные системы Debian и Ubuntu, по умолчанию символьные sh по dash;
  2. Busybox , который обычно запускается во время загрузки системы Linux как часть initramfs. Он использует реализацию оболочки ash.
  3. BSD и вообще любые системы, отличные от Linux. OpenBSD использует pdksh, потомок оболочки Korn. FreeBSD sh является потомком исходной оболочки UNIX Bourne. Solaris имеет свой собственный sh, который долгое время не был совместим с POSIX; свободная реализация доступна из проекта Heirloom .

Как вы можете узнать, что указывает /bin/sh на вашу систему?

Усложнение состоит в том, что /bin/sh может быть символической ссылкой или жесткой ссылкой. Если это символическая ссылка, способ portable для ее устранения:

% file -h /bin/sh
/bin/sh: symbolic link to bash

Если это жесткая ссылка, попробуйте

% find -L /bin -samefile /bin/sh
/bin/sh
/bin/bash

Фактически , флаг -L охватывает как символические ссылки, так и жесткие ссылки, но недостатком этого метода является то, что он не переносимый - POSIX не требует find для поддержки опции -samefile, хотя оба GNU find и FreeBSD find поддерживают его.

Shebang line

В конечном счете, вам решать, какой из них использовать, написав строку «shebang».

Например,

#!/bin/sh

будет использовать sh (и все, что происходит с точкой),

#!/bin/bash

будет использовать /bin/bash, если он доступен (и сбой с сообщением об ошибке, если это не так). Конечно, вы также можете указать другую реализацию, например

#!/bin/dash

Какой из них использовать

Для моих собственных сценариев я предпочитаю sh по следующим причинам:

  • стандартизировано
  • намного проще и легче учиться
  • , оно переносится через системы POSIX - даже если они не имеют bash, они должны иметь sh

. Есть также преимущества использования bash. Его функции делают программирование более удобным и похожим на программирование на других современных языках программирования. К ним относятся такие области, как локальные переменные и массивы. Обычный sh - очень минималистический язык программирования.

7
задан user_mda 29 March 2019 в 17:58
поделиться

2 ответа

Но реальный вопрос в том, является ли модифицируемый Dtype при обновлении?

Нет, вы не можете: source .

Из вашего примера ваш чистый код Java будет выглядеть следующим образом:

Parent parent = new Parent(); //object received from request, stored in database as it is
if (some conditions is met) {
   // FirstChild firstChild = (Parent) parent; //this would throw ClassCastException
   FirstChild firstChild = new FirstChild(parent); //creating new object, gc will collect parent
}

Таким образом, hibernate действует так же, как и Java: вы не можете обновить Parent, вы должны создать новую запись для firstChild и удалить parent.

Не поможет ли вам использовать @DiscriminatorFormula вместо проверки some condition is met при обработке запроса?

@DiscriminatorFormula("case when value = 'some value' then 'FirstChild' else 'SecondChild' end")

Тогда вам не придется сохранять Parent, а затем обрабатывать его записи.

0
ответ дан Tijkijiki 29 March 2019 в 17:58
поделиться

Это мои выводы:

  1. Нет объективной причины, по которой Child следует расширять Parent . С точки зрения моделирования, я бы вместо этого назвал один абстрактный класс FamilyMember , а затем Parent , FirstBorn и [115 ] будет исходить от члена семьи.
  2. Проблема понижения будет решена с помощью (1)
  3. Hibernate не поддерживает обновление значения дискриминатора. Это означает, что если ребенок достиг совершеннолетия и уже не ребенок, а родитель. Дочерняя запись должна быть удалена, и должна быть создана новая запись, соответствующая Parent. Вот как это работает. Ребенок является ребенком до тех пор, пока он больше не является ребенком, а затем дочерняя запись удаляется, и создается новая, не дочерняя запись.
0
ответ дан Alexandar Petrov 29 March 2019 в 17:58
поделиться
Другие вопросы по тегам:

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