Класс домена Grails 2.5.3 со списком встроенных объектов

Как создать свойство List встроенных объектов в доменном классе Grails 2.5.3 (не объекты домена и не базовые типы, такие как String, Integer и т. д.)?

Я пробовал много комбинаций static embedded, static hasMany и т. д., но ни одна из них не работает.

В большинстве случаев я получаю следующее исключение при запуске run-app:

org.hibernate.MappingException

Missing type or column

for column[list_property_embedded_class]

on domain[DomainClass]

referencing[EmbeddedClassFQCN]

Где значения в [] заменяются моими фактическими именами классов/столбцов.

(Я переместил сообщение об исключении, чтобы сделать его более читаемым; на самом деле это однострочный текст)


person XDR    schedule 30.01.2016    source источник
comment
Какие встроенные объекты? Занятия от src/groovy? Вы хотите, чтобы эти объекты сохранялись в базе данных или они временные?   -  person tylerwal    schedule 31.01.2016
comment
Классы из src/groovy, которые я хочу сохранить, но которые не обязательно должны быть отдельными объектами, и которые я также хочу использовать как обычные свойства встроенных объектов; например, для класса встроенных объектов EmbeddedObject иногда мне потребуется свойство типа EmbeddedObject, а иногда свойство типа List<EmbeddedObject>. Я не могу заставить последний работать.   -  person XDR    schedule 31.01.2016
comment
Кто бы ни проголосовал за этот вопрос, объясните, почему, и, возможно, я смогу улучшить вопрос. В случае, если это произошло потому, что я не указал, хочу ли я, чтобы встроенные объекты были постоянными или временными: я не упомянул, что именно, потому что я думал, что встроенные объекты всегда сохраняются (т.е. не существует такой вещи, как временный встроенный объект; он бы просто быть переходным).   -  person XDR    schedule 31.01.2016


Ответы (1)


Если вы прибегаете к использованию традиционного спящего режима, а не GORM, то то, что вы ищете, будет @ElementCollection. Из примеров Hibernate:

@Entity
public class User {
   [...]
   public String getLastname() { ...}

   @ElementCollection
   @CollectionTable(name="Addresses", joinColumns=@JoinColumn(name="user_id"))
   @AttributeOverrides({
      @AttributeOverride(name="street1", column=@Column(name="fld_street"))
   })
   public Set<Address> getAddresses() { ... } 
}

@Embeddable
public class Address {
   public String getStreet1() {...}
   [...]
}

Я попытался создать тестовый проект с одним классом домена и списком классов из src/groovy, но безуспешно. Я пробовал разные варианты применения аннотаций от @ElementCollection ко всему в их примере, но безуспешно. Я предполагаю, что аннотации Hibernate просто не работают с доменными классами Grails; это также подтверждается документацией по Grails, в которой аннотации применяются к POJO в src/java. Лично я не вижу в этом достойного варианта.

Что касается GORM-эквивалента @ElementCollection, то в Grails для этой функции открыт неразрешенный тикет JIRA: GRAILS-10095.

Я сомневаюсь в необходимости или пользе встроенной коллекции объектов; в отличие от традиционного встроенного объекта (поддерживается static embedded), который приводит к действительному внедрению дополнительных столбцов в таблицу SQL класса предметной области, встроенная коллекция потребует наличия другой таблицы. Люди, работающие над Hibernate, умнее меня, так что я уверен, что на то есть веская причина.

person tylerwal    schedule 31.01.2016
comment
Спасибо за расследование. Однако я пока не буду отмечать ваш пост как ответ, на случай, если кто-то еще знает, как это сделать в GORM, хотя, судя по заявке JIRA, похоже, что это невозможно в GORM. Причина, по которой я хочу @ElementCollection, заключается в том, что я хочу использовать один класс как обычный встроенный объект, но иногда мне нужно иметь его в свойстве List, а не как обычное свойство с одним значением. Я не могу сделать это без @ElementCollection. Кроме того, иногда некоторые данные не должны быть доступны сами по себе: у ссылающегося класса может быть код, обеспечивающий его согласованность. - person XDR; 31.01.2016