Объект внешнего ключа как первичный ключ - PullRequest
0 голосов
/ 13 июля 2011

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

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 Ответ

0 голосов
/ 13 июля 2011

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

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

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

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

...