Можно ли иметь код проверки типа при работе с базами данных? - PullRequest
0 голосов
/ 19 января 2019

Я пытаюсь вставить некоторый код в базу данных.Но я столкнулся с проблемой при работе с моделями, которые являются подклассами друг друга.У меня есть список, который содержит все эти подпункты.

List<Metric> metrics = experiment.getMetrics();

for(Metric m : metrics) {
    int id = m.getId();
    // type checking code

}

Метрика содержит подклассы рейтинга и количества.Каждый из них, в свою очередь, имеет свои уникально определенные таблицы.Я не согласен с идеей использования проверки типов.Но я не вижу немедленного решения.Одна из альтернатив, которая не выглядит лучше, - создать новый столбец в таблице Metric с именем metric_type.Но это приведет к чему-то очень похожему на проверку типов.Есть предложения?

Ответы [ 2 ]

0 голосов
/ 19 января 2019

Вы столкнулись с Несоответствием объектно-реляционного импеданса из-за соответствия между не полностью совместимыми системами.Поскольку наследование между таблицами в реляционной модели невозможно, вам придется пожертвовать чем-то в объектной модели, которая использует наследование.Будут крайние случаи независимо от того, что вы делаете, если вы не переключитесь на объектную базу данных .

Если вы определяете пользовательские операции CRUD в классах, которые расширяют Metric, загрузка объектов может быть сложной.Что именно будет загружено Metric.get(id), если каждая таблица имеет свою собственную последовательность PK, и оба значения Rating и Quantity могут иметь одинаковое числовое значение PK.

Вы можете посмотреть, как JPA решает эту проблему.проблема.Он использует пользовательские аннотации, например @MappedSuperclass и @Entity.Я думаю, что это форма проверки типа.

0 голосов
/ 19 января 2019

Я бы не советовал вам печатать check

Чтобы решить эту проблему, можно создать метод insert в классе Metric.Затем переопределите метод в Rating и Quality с помощью соответствующего кода, который вставляет объект в соответствующую таблицу.

for(Metric m : metrics) {
    int id = m.getId();
    m.insert();

}

Внутри вашего цикла просто вызовите insert и из-за позднего связываниябудет вызван соответствующий метод и будет выполнен правильный код.

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