1

我有一个问题,我花了很多时间试图解决这个问题,我真的想不出任何其他可能的解决方案,我真的需要你的帮助,看看我是否在这里遗漏了什么......

表 SYS_USER 和 SYS_ROLE 分别具有 OneToMany 关系和 ManyToOne 关系,如下所示(我仅粘贴相关信息)

系统角色.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;
}

系统用户.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 移动到“SYS_USER.user_id”字段可以解决问题,但理想情况下,我希望“SYS_USER.user_name”不是 PK,因为它必须随时更改到时间(仍然,应该是唯一的)。

所有实体都已使用 Hibernate Reveng 自动生成,文件中没有特定设置或重新映射。

非常感谢!戴夫

4

0 回答 0