Я пытаюсь выполнить реверс-инжиниринг базы данных Roo, и у меня возникла проблема с моей первой реальной базой данных. Для этого вопроса я создал минимальный пример, показывающий проблему. В БД есть таблица sl_person, таблица sl_group и таблица мостов sl_person_group, так как человек может принадлежать к 0 или более группам.
CREATE DATABASE `rooperson` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
CREATE TABLE IF NOT EXISTS `sl_group` (
`id_group` int(11) NOT NULL DEFAULT '0',
`name` varchar(80) NOT NULL,
`description` text,
UNIQUE KEY `id_group_idx` (`id_group`),
UNIQUE KEY `name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `sl_person` (
`id_person` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(64) DEFAULT NULL,
`surname` varchar(64) DEFAULT NULL,
PRIMARY KEY (`id_person`),
KEY `name` (`name`),
KEY `surname` (`surname`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=5727 ;
CREATE TABLE IF NOT EXISTS `sl_person_group` (
`id_person` int(11) NOT NULL DEFAULT '0',
`id_group` int(11) NOT NULL DEFAULT '0',
UNIQUE KEY `id_person_group_idx` (`id_person`,`id_group`),
KEY `id_group` (`id_group`)
) ENGINE=InnoDB DEFAULT CHARSET;
ALTER TABLE `sl_person_group`
ADD CONSTRAINT `sl_person_group_ibfk_2` FOREIGN KEY (`id_group`) REFERENCES `sl_group` (`id_group`),
ADD CONSTRAINT `sl_person_group_ibfk_1` FOREIGN KEY (`id_person`) REFERENCES `sl_person` (`id_person`);
В Eclipse я создаю новый проект Spring Roo с помощью Spring Source Tool Suite: Файл -> Создать -> Проект -> Проект Spring Roo
Project Name: rooperson
Top level package name: org.obliquid.rooperson
Next -> Finish
Затем в командной оболочке я набираю:
persistence setup --database MYSQL --provider HIBERNATE
database properties set --key database.password --value xxxxx
database properties set --key database.username --value rooperson
database properties set –key database.url –value jdbc:mysql://localhost/rooperson?zeroDateTimeBehavior=convertToNull&characterEncoding=UTF-8
database reverse engineer --schema PUBLIC --package org.obliquid.rooperson.domain
web mvc setup
Тогда я исправил небольшую проблему с таблицами стилей .
Однако, когда я пытаюсь запустить GlasshFish 3.1.1, приложение не запускается со следующей ошибкой.
ИНФОРМАЦИЯ: 2011-09-11 20: 42: 59,562 [admin-thread-pool-4848 (3)] ОШИБКА org.springframework.web.context.ContextLoader - Ошибка инициализации контекста
org.springframework.beans.factory.BeanCreationException: Ошибка при создании bean-компонента с именемactionactionManager
определено в файле [/usr/local/glassfish3/glassfish/domains/domain1/eclipseApps/rooperson/WEB-INF/classes/META-INF/spring/applicationContext.xml]:
Не удается разрешить ссылку на bean-компонент "entityManagerFactory" при установке свойства бина "entityManagerFactory";
Вложенным исключением является org.springframework.beans.factory.BeanCreationException:
Ошибка создания бина с именем entityManagerFactory, определенным в файле
[/Usr/local/glassfish3/glassfish/domains/domain1/eclipseApps/rooperson/WEB-INF/classes/META-INF/spring/applicationContext.xml]:
Ошибка вызова метода init; вложенное исключение: org.hibernate.AnnotationException: referencedColumnNames (id_group)
org.obliquid.rooperson.domain.SlPersonGroup.idGroup ссылается на org.obliquid.rooperson.domain.SlGroup, который не сопоставлен с одним свойством
в org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference (BeanDefinitionValueResolver.java:328)
Сгенерированный файл SlPersonGroup_Roo_DbManaged.aj начинается с:
privileged aspect SlPersonGroup_Roo_DbManaged {
@ManyToOne
@JoinColumn(name = "id_group", referencedColumnName = "id_group", nullable = false, insertable = false, updatable = false)
private SlGroup SlPersonGroup.idGroup;
@ManyToOne
@JoinColumn(name = "id_person", referencedColumnName = "id_person", nullable = false, insertable = false, updatable = false)
private SlPerson SlPersonGroup.idPerson;
Как я могу решить проблему? Если мне нужно предоставить больше информации, дайте мне знать.