Класс домена Grails без поля ID или с частично пустым составным полем
В ответе на предыдущий вопрос (ответ здесь: представления SQL/Database в Grails) я пытался использовать класс домена для представления представления в моей базе данных. Это прекрасно работает в большинстве случаев, однако:
У меня есть вид без единого уникального ключа. Допустим, базовые таблицы выглядят так:
A:
идентификатор, varX
1,"Ли"
2, "Foo"
3, "Бар"
B:
идентификатор, A.id, C.id
1,2,1
2,2,2
3,3,1
C:
идентификатор, Вары
1,"Стрела"
2, "Fizzle"
Мой взгляд выглядит так:
A.id, varX, B.id, C.id, Вары
1,"Л", NULL, NULL, NULL
2, "Foo", 1,1,"Стрела"
2, "Foo", 2,2, "Fizzle"
3, "Бар",3,1,"Стрела"
Именно так оно и должно выглядеть для наших целей. Однако, как вы можете видеть, лучшим уникальным составным идентификатором, который мы могли бы создать для представления, является ['A.id','C.id'], поскольку это однозначно идентифицирует каждый элемент, но Grails терпит неудачу, потому что кажется, что он не может иметь дело с часть составного идентификатора, имеющая значение NULL (фактически, list() возвращает список из 4 объектов, первый - нулевой указатель, остальные - фактические экземпляры домена представления).
Обратите внимание, что мы могли бы также использовать A.id и B.id, но это страдает от той же проблемы.
Также обратите внимание, что мы ХОТИМ отображать элементы из таблицы A хотя бы один раз (со значениями NULL для любых полей, не найденных в таблицах B / C), возможно, много раз, если в таблице B имеется несколько соответствующих записей.
Итак, мой вопрос состоит из 2 частей:
1: возможно ли вообще определить класс домена grails без какого-либо поля идентификатора? Нам не нужен постоянный дескриптор ни одной из записей представлений, нам просто нужно перечислить данные в этом представлении.
2: Если нет, возможно ли определить класс домена grails с полем составного идентификатора, частью которого может быть NULL, но который в любом случае будет однозначно идентифицировать строку, даже если часть составного идентификатора равна NULL?
Я знаю, что мы можем использовать прямой Groovy SQL для непосредственного запроса к представлению без связанного с ним класса домена (на самом деле мы делаем это сейчас), но в идеале мы хотели бы представить представление с помощью класса домена. Кроме того, несмотря на все аргументы, эти два вопроса могут быть применены гораздо более обобщенно, чем просто к нашей конкретной проблеме.
2 ответа
У нас была эта проблема раньше.
По моему опыту, составные идентификаторы не очень хорошо поддерживаются в Grails или, возможно, в Hibernate.
Мы всегда находим способ иметь уникальный идентификатор для всех классов наших доменов.
Для реальных таблиц мы просто добавляем поле автоинкремента, даже если бы мы не использовали grails, мы бы использовали ключ Composite.
Для представлений базы данных у нас обычно есть идентификатор уже в одной из соединенных таблиц, который в конечном итоге оказывается уникальным в этом контексте, но если мы этого не делаем, есть способы взломать / смоделировать это. Например, в SQL просто объедините ключи, которые вы использовали бы в своем составном ключе, в одно поле и используйте его в качестве ключа.
Вы пробовали то, что упоминается в разделе "Составные идентификаторы" на этой странице ссылок? Я не пробовал использовать его сам и не уверен, изменилось ли это в последней версии.
Кроме того, если вы посмотрите на таблицу B, единственными значениями для A.id являются 2 и 3, поэтому не думаете ли вы, что когда A.id равен 1, результат будет нулевым для B.id, C.id и varY? или это только для примера?