[英]foreign key constraint fails - hibernate
我尝试将数据添加到表USERS时遇到问题。 首先是我的数据库和类。
数据库结构:
CREATE TABLE IF NOT EXISTS `admins` (
`ADMIN_ID` int(10) unsigned NOT NULL AUTO_INCREMENT ,
`USERNAME` varchar(45) NOT NULL,
`PASSWORD` varchar(45) NOT NULL,
`AUTHORITY` varchar(45) NOT NULL,
PRIMARY KEY (`ADMIN_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `lecturers` (
`LECTURER_ID` int(10) unsigned NOT NULL AUTO_INCREMENT,
`NAME` varchar(45) NOT NULL,
`SURNAME` varchar(45) NOT NULL,
`TITLES` varchar(45) NOT NULL,
`USERNAME` varchar(45) NOT NULL,
`PASSWORD` varchar(45) NOT NULL,
`AUTHORITY` varchar(45) NOT NULL,
`LEC_DESCRIPTION` varchar(100) NOT NULL,
PRIMARY KEY (`LECTURER_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=40;
CREATE TABLE IF NOT EXISTS `roles_name` (
`role_id` int(1) NOT NULL,
`authority` varchar(45) NOT NULL,
UNIQUE KEY `role_id` (`role_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
INSERT INTO `roles_name` (`role_id`, `authority`) VALUES
(1, 'ROLE_ADMIN'),
(2, 'ROLE_USER'),
(3, 'ROLE_LECTURER');
CREATE TABLE IF NOT EXISTS `users` (
`USER_ID` int(10) unsigned NOT NULL AUTO_INCREMENT ,
`NAME` varchar(45) NOT NULL,
`SURNAME` varchar(45) NOT NULL,
`username` varchar(45) NOT NULL,
`PASSWORD` varchar(45) NOT NULL,
`USER_DESCRIPTION` varchar(100) NOT NULL,
`AUTHORITY` varchar(45) NOT NULL,
`ENABLED` tinyint(1) NOT NULL,
PRIMARY KEY (`USER_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=50000;
CREATE TABLE IF NOT EXISTS `roles_map` (
`rm_id` int(10) unsigned NOT NULL,
`user_id` int(10) unsigned,
`admin_id` int(10) unsigned,
`lecturer_id` int(10) unsigned,
`username` varchar(45) NOT NULL,
`password` varchar(45) NOT NULL,
`role_id` int(1) NOT NULL,
PRIMARY KEY (`rm_id`),
FOREIGN KEY (`user_id`) REFERENCES `users` (`user_id`),
FOREIGN KEY (`lecturer_id`) REFERENCES `lecturers` (`lecturer_id`),
FOREIGN KEY (`admin_id`) REFERENCES `admins` (`admin_id`),
FOREIGN KEY (`role_id`) REFERENCES `roles_name` (`role_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
RolesMap.java
@Entity
@Table(name = "roles_map")
public class RolesMap {
@Id
@Column(name = "RM_ID", unique = true, nullable = false)
private int rm_id;
//@Column(name = "USER_ID", unique = true)
//private int user_id;
@Column(name = "ADMIN_ID", unique = true)
private int admin_id;
@Column(name = "LECTURER_ID", unique = true)
private int lecturer_id;
@Column(name = "USERNAME", unique = true, nullable = false)
private String username;
@Column(name = "PASSWORD", unique = true, nullable = false)
private String password;
@Column(name = "ROLE_ID", unique = true, nullable = false)
private int role_id;
@ManyToOne(cascade={CascadeType.ALL})
@JoinColumn(name = "user_id")
private User user;
//getters and setters
}
User.java
@Entity
@Table(name = "users")
public class User {
@Id
@Column(name = "USER_ID", unique = true, nullable = false)
private int user_id;
@Column(name = "NAME", nullable = false)
private String name;
@Column(name = "SURNAME", unique = true, nullable = false)
private String surname;
@Column(name = "USERNAME", unique = true, nullable = false)
private String username; // zamiast username
@Column(name = "PASSWORD", unique = true, nullable = false)
private String password;
@Column(name = "USER_DESCRIPTION", nullable = false)
private String userDescription;
@Column(name = "AUTHORITY", nullable = false)
private String authority = "ROLE_USER";
@Column(name = "ENABLED", nullable = false)
private int enabled;
@OneToMany(mappedBy="user", cascade=CascadeType.ALL)
private List <RolesMap> rolesMap;
//getters and setters
}
加法
public String addUser() {
Session sess = null;
try {
sess = UserDao.getSessionFactory().openSession();
sess.beginTransaction();
RolesMap roles = new RolesMap();
//roles.setrUser(user);
User user = new User();
roles.setPassword(getPassword());
roles.setRole_id(2);
roles.setUsername(getUsername());
user.setName(getName());
user.setSurname(getSurname());
user.setUsername(getUsername());
user.setPassword(getPassword());
user.setUserDescription(getUserDescription());
user.setAuthority(getAuthority());
user.setEnabled(getEnabled());
user.setRolesMap(new ArrayList<RolesMap>());
user.getRolesMap().add(roles);
sess.save(user);
sess.getTransaction().commit();
//getUserService().addUser(user);
return SUCCESS;
} catch (DataAccessException e) {
e.printStackTrace();
}
return ERROR;
}
当我尝试用这种方法我有错误:无法添加或更新子行,外键约束失败( soeOne2
。 roles_map
,约束roles_map_ibfk_2
外键( lecturer_id
)参考文献lecturers
( LECTURER_ID
))
但是我不知道为什么,因为我正在尝试将数据添加到USER和ROLESMAP表中。 我认为将数据添加到表时,ROLESMAP表中的ROLESMAP / USER字段讲者ID和admin_id应该为NULL。 谁能告诉我我在做什么错?
这是因为lecturer_id=0
不是 lecturer_id=null
。
您的应用程序尝试保存lecturer_id=0
ID lecturer_id=0
,数据库认为表lecturers
项目的ID为0
。
因此,第一个工作环境是将int
替换为Integer
,以便您可以分配lecturer_id = null
ID lecturer_id = null
@Column(name = "LECTURER_ID", unique = true)
private Integer lecturer_id;
而且我认为您需要对所有其他以相同方式工作的引用进行此修改。
第二点是,您在实体之间映射引用的方式不是jpa(休眠)方式。 我强烈建议您阅读一些有关映射关系的信息(OneToOne,OneToMany,ManyToOne,ManyToMany),例如,《 Hibernate参考》 第7章。集合映射和8.关联映射。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.