我正在尝试Roo数据库逆向工程,我的第一个真正的数据库出了问题。对于这个问题,我创建了一个显示问题的最小示例。在DB中有一个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 Source Tool Suite创建了一个新的Spring Roo项目:File - >新 - >项目 - > Spring Roo项目
Project Name: rooperson
Top level package name: org.obliquid.rooperson
Next -> Finish
然后在roo shell中输入:
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
然后我修复了a small problem with stylesheets。
但是,当我尝试启动GlasshFish 3.1.1时,应用程序不会以下列错误启动。
INFO:2011-09-11 20:42:59,562 [admin-thread-pool-4848(3)] ERROR org.springframework.web.context.ContextLoader - 上下文初始化失败 org.springframework.beans.factory.BeanCreationException:创建名为'transactionManager'的bean时出错 在文件[/usr/local/glassfish3/glassfish/domains/domain1/eclipseApps/rooperson/WEB-INF/classes/META-INF/spring/applicationContext.xml]中定义: 设置bean属性'entityManagerFactory'时无法解析对bean'entalManagerFactory'的引用; 嵌套异常是org.springframework.beans.factory.BeanCreationException: 创建在文件中定义名称为“entityManagerFactory”的bean时出错 [/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;
我该如何解决这个问题?如果我应该提供更多信息,请告诉我。
答案 0 :(得分:-3)
这里有类似的问题。看起来这个版本的Roo存在复合主键的问题(如在sl_person_group表中)。
虽然将密钥引用到单个列会阻止这种情况发生,但不幸的是,它可能不是您的数据模型所要求的。