Объект внешнего ключа как первичный ключ

У меня есть следующий домен-класс-сущность:

class AccountSupplier {

static mapping = {
     table 'MY_TABLE'
     version false

     // references-column-mapping
     accountReference: column:'REFACNTID'
     supplierReference column:'REFSUPID'

    // primary / foreign keys
    id generator: 'assigned', column: 'REFACNTID'
    id generator: 'assigned', column: 'REFSUPID'
}

Account accountReference
Supplier supplierReference

static constraints = {
    accountReference(insert:false, update:false, nullable:false)
    supplierReference(insert:false, update:false, nullable:false)
}
}

который должен отобразить реальную таблицу в базе данных оракула (уже существует и содержит тысячи записей).

Когда я хочу запустить Grails, я получаю следующее исключение:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'messageSource': Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'transactionManager': Cannot resolve reference to bean 'sessionFactory' while setting bean property 'sessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory': Invocation of init method failed; nested exception is org.hibernate.MappingException: Repeated column in mapping for entity: AccountSupplier column: REFSUPID (should be mapped with insert="false" update="false")
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:527)
at org.codehaus.groovy.grails.commons.spring.ReloadAwareAutowireCapableBeanFactory.doCreateBean(ReloadAwareAutowireCapableBeanFactory.java:105)

Что не так с этим? мне нужно изменить связанные объекты? Не могу ли я сделать внешний ключ для первичного ключа?

Спасибо

1 ответ

Во-первых, обычный комментарий: внешние ключи не используются в качестве первичных ключей. Это будет (и, вероятно, уже) причинит вам много головной боли. Если вы можете изменить это, измените это.

Тем не менее, ваша проблема в том, что вы добавили два генератора идентификаторов к сущности. Я предполагаю, что Grails поддерживает только один для каждой сущности (в конце концов, каждая сущность может иметь только один первичный ключ).

Я думаю, что вы смешиваете таблицу DB и отображение в своем уме. Отображение не использует идентификаторы. Он знает только о ссылках. То, что где-то есть удостоверение личности, не должно вас беспокоить.

Фактически, для этого отображения вы не должны использовать какой-либо генератор идентификаторов. Идентификаторы назначаются автоматически при назначении экземпляров для полей. Если вы хотите генераторы идентификаторов, добавьте их в сопоставления для Account а также Supplier,

Другие вопросы по тегам