我有一个问题,我花了很多时间试图解决这个问题,我无法提出任何其他可能的解决方案,我真的需要你的帮助,看看我是否遗漏了某些东西这里....
表SYS_USER和SYS_ROLE分别具有OneToMany关系和ManyToOne,看起来如下(我只粘贴相关信息)
SysRole.java
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="user_name", nullable=false)
public SysUser getSysUser() {
return this.sysUser;
}
public void setSysUser(SysUser sysUser) {
this.sysUser = sysUser;
}
SysUser.java
@OneToMany(fetch=FetchType.LAZY, mappedBy="sysUser")
public Set<SysRole> getSysRoles() {
return this.sysRoles;
}
public void setSysRoles(Set<SysRole> sysRoles) {
this.sysRoles = sysRoles;
}
数据库如下所示:
CREATE TABLE `SYS_ROLE` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_name` varchar(45) NOT NULL,
`role_name` varchar(45) NOT NULL,
`role_type` varchar(10) NOT NULL,
PRIMARY KEY (`id`),
KEY `FK_USERS` (`user_name`),
CONSTRAINT `FK_USERS` FOREIGN KEY (`user_name`) REFERENCES `SYS_USER`
(`user_name`) ON DELETE NO ACTION ON UPDATE NO ACTION)
ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1;
CREATE TABLE `SYS_USER` (
`user_id` int(10) unsigned zerofill NOT NULL AUTO_INCREMENT,
`user_name` varchar(45) NOT NULL,
`user_password` varchar(200) DEFAULT NULL,
`user_first_name` varchar(45) DEFAULT NULL,
`user_last_name` varchar(45) DEFAULT NULL,
`user_email` varchar(45) DEFAULT NULL,
PRIMARY KEY (`user_id`),
UNIQUE KEY `user_name_UNIQUE` (`user_name`),
UNIQUE KEY `user_id_UNIQUE` (`user_id`))
ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;
我在服务器启动时遇到的错误是:
Caused by: org.hibernate.tool.schema.spi.SchemaManagementException:
Schema-validation: wrong column type encountered in
column [user_name]
in table [SYS_ROLE];
found [varchar (Types#VARCHAR)],
but expecting [integer (Types#INTEGER)]
我可以验证将主键从字段ID移动到&#39; SYS_USER.user_id&#39; 字段,解决了问题,但理想情况下我更喜欢 &#39; SYS_USER.user_name&#39; 不会是PK,因为它必须不时更改(仍然应该是唯一的)。
所有实体都已通过Hibernate Reveng自动生成,没有特定设置或在文件中重新映射。
非常感谢! 戴夫