Java 多对多映射Hibernate获取ConstraintViolationException
这是相关的Java代码 Role.JavaJava 多对多映射Hibernate获取ConstraintViolationException,java,hibernate,many-to-many,Java,Hibernate,Many To Many,这是相关的Java代码 Role.Java @Entity @Table(name = "role") public class Role extends BasicModel { private static final long serialVersionUID = 1L; @Id @Column(name = "id") private int id; @Column(name = "role_name") private String roleName; @OneToMany(
@Entity
@Table(name = "role")
public class Role extends BasicModel {
private static final long serialVersionUID = 1L;
@Id
@Column(name = "id")
private int id;
@Column(name = "role_name")
private String roleName;
@OneToMany(mappedBy = "pk.role", cascade=CascadeType.ALL)
private Set<UserRoles> userRoles = new HashSet<UserRoles>();
//Getters and Setters
}
@Entity
@Table(name = "user")
public class User extends BasicModel{
@Id
@Column(name = "id")
private int id;
@Column(name = "name")
private String name;
@Column(name = "email")
private String email;
@Column(name = "password")
private String password;
@OneToMany(mappedBy = "pk.user", cascade=CascadeType.ALL)
private Set<UserRoles> userRoles = new HashSet<UserRoles>();
//getters and setters
}
@Entity
@Table(name = "user_roles")
@AssociationOverrides({
@AssociationOverride(name = "pk.user",
joinColumns = @JoinColumn(name = "user_id")),
@AssociationOverride(name = "pk.role",
joinColumns = @JoinColumn(name = "role_id")) })
public class UserRoles extends BasicModel {
private static final long serialVersionUID = 1L;
@Id
@Column(name = "id")
private int id;
@EmbeddedId
private UserRoleId pk = new UserRoleId();
//Getters and Setters
}
**UserRoleId.java**
public class UserRoleId {
@ManyToOne
private User user;
@ManyToOne
private Role role;
//Getters and Setters
}
这是我用来插入的代码
tx = session.beginTransaction();
User user = new User();
user.setName("admin");
user.setPassword("admin");
user.setEmail("admin@admin.com");
Role role = new Role();
role.setRoleName("admin");
session.save(role);
UserRoles userRole = new UserRoles();
userRole.setUser(user);
userRole.setRole(role);
user.getUserRoles().add(userRole);
session.save(user);
tx.commit();
在Role和User类中,如果我将cascadetype设置为ALL like
@OneToMany(mappedBy = "pk.role", cascade=CascadeType.ALL)
private Set<UserRoles> userRoles = new HashSet<UserRoles>();
如果我将CascadeType设置为其他值,则会更新用户表和角色表,而不会更新链接表用户_角色
这是mysql中的表结构
角色
DROP TABLE IF EXISTS `test`.`role`;
CREATE TABLE `test`.`role` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`role_name` varchar(100) DEFAULT NULL,
`created_user` varchar(45) NOT NULL,
`created_date` datetime NOT NULL,
`updated_user` varchar(45) NOT NULL,
`updated_date` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;
用户
DROP TABLE IF EXISTS `test`.`user`;
CREATE TABLE `test`.`user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) DEFAULT NULL,
`email` varchar(50) DEFAULT NULL,
`password` varchar(64) DEFAULT NULL,
`created_user` varchar(45) NOT NULL,
`created_date` datetime NOT NULL,
`updated_user` varchar(45) NOT NULL,
`updated_date` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;
用户角色
DROP TABLE IF EXISTS `test`.`user_roles`;
CREATE TABLE `test`.`user_roles` (
`id` int(10) NOT NULL,
`role_id` int(11) NOT NULL,
`user_id` int(11) NOT NULL,
`created_user` varchar(45) NOT NULL,
`created_date` datetime NOT NULL,
`updated_user` varchar(45) NOT NULL,
`updated_date` datetime NOT NULL,
PRIMARY KEY (`id`),
KEY `FK_user_roles_user` (`user_id`),
KEY `FK_user_roles_roles` (`role_id`),
CONSTRAINT `FK_user_roles_roles` FOREIGN KEY (`role_id`) REFERENCES `role` (`id`),
CONSTRAINT `FK_user_roles_user` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
请帮忙。我浏览了这个链接 执行了这个命令
show engine innodb status
在mysql命令行中找到,查询如下生成
insert into user_roles (created_date, created_user, updated_date, updated_user, role_id, user_id, id) values ('2014-11-01 11:57:03', 'test', '2014-11-01 11:57:03', 'test', 0, 0, 0);
这是因为
用户id和角色id的值没有增加
现在我添加了这一行
@GeneratedValue(strategy = GenerationType.IDENTITY)
在用户表和角色表中自动生成id,问题现在已经解决
谢谢
@GeneratedValue(strategy = GenerationType.IDENTITY)