Класс домена Grails без поля идентификатора или с частично NULL составным полем

За ответ на предыдущий вопрос (ответ здесь: Представления SQL / базы данных в Grails), Я попытался использовать класс предметной области для представления представления в моей базе данных. Однако в большинстве случаев это прекрасно работает:

У меня представление без единого уникального ключа. Скажем, базовые таблицы выглядят так:

A:
id, varX
1, "Blah"
2, "Foo"
3, "Bar"

B:
id,A.id,C.id
1,2,1
2,2,2
3,3,1

C:
id, varY
1, "Boom"
2, "Fizzle"

Мое представление выглядит так:
A.id, varX, B.id, C.id, varY
1, "Blah", NULL, NULL, NULL
2, "Foo", 1,1, «Бум»
2, «Фу», 2,2, «Шип»
3, «Бар», 3,1, «Бум»

Именно так это должно выглядеть для наших целей. Однако, как вы можете видеть, лучший уникальный составной идентификатор, который мы могли бы создать для представления, - это ['A.id', 'C.id'], поскольку он однозначно идентифицирует каждый элемент, но Grails терпит неудачу, потому что не может иметь дело с часть составного идентификатора имеет значение NULL (фактически, list () возвращает список из 4 объектов, первый из которых является нулевым указателем, остальные являются фактическими экземплярами домена представления).

Обратите внимание, что мы также можем использовать A.id и B.id, но у них та же проблема.

Также обратите внимание, что мы ХОТИМ отображать элементы из таблицы A хотя бы один раз (с нулевыми значениями для любых полей, не найденных в таблицах B / C), возможно, много раз, если есть несколько соответствующих записей в таблице B.

Итак, мой вопрос состоит из двух частей:
1: можно ли вообще определить класс домена grails без какого-либо поля идентификатора? Нам не нужен постоянный дескриптор для какой-либо из записей представлений, нам просто нужно перечислить данные в этом представлении.
2: Если нет, можно ли определить класс домена grails с полем составного идентификатора, часть из которых может быть NULL, но который в любом случае будет однозначно идентифицировать строку, даже если часть составного идентификатора равна NULL?

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


person Chris King    schedule 09.01.2009    source источник


Ответы (2)


У нас была такая проблема раньше.

По моему опыту, составные идентификаторы просто не очень хорошо поддерживаются в Grails или, возможно, в Hibernate.

Мы всегда находим способ иметь уникальный идентификатор для всех наших доменных классов.

Для реальных таблиц мы просто добавляем поле автоинкремента, хотя, если бы мы не использовали grails, мы бы использовали составной ключ.

Для представлений базы данных у нас обычно есть идентификатор уже в одной из соединенных таблиц, который оказывается уникальным в этом контексте, но если мы этого не сделаем, есть способы взломать / смоделировать это. Например, в SQL просто объедините ключи, которые вы будете использовать в своем составном ключе, как одно поле и используйте его как ключ.

person Community    schedule 21.07.2009

Вы пробовали то, что упоминается в разделе составных идентификаторов на этой справочной странице? Я сам не пробовал использовать его и не уверен, изменилось ли оно в последней версии.

Кроме того, если вы посмотрите на таблицу B, единственные значения для A.id - 2 и 3, так что не думаете ли вы, что, когда A.id равен 1, результат будет нулевым для B.id, C.id и varY? или это было только для примера?

person andHapp    schedule 10.01.2009
comment
Результат / is / null для B.id, C.id и varY ... см. Строку, которая говорит: 1, Blah, NULL, NULL, NULL. Представление использует два левых соединения. Кроме того, да, я пробовал все это, проблема в том, что ни один компонент составного поля не может быть нулевым, что было бы в случае любого разумного составного поля для представления выше. - person Chris King; 22.12.2009