Объект внешнего ключа как первичный ключ
У меня есть следующий домен-класс-сущность:
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
,