Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 多对多映射Hibernate获取ConstraintViolationException_Java_Hibernate_Many To Many - Fatal编程技术网

Java 多对多映射Hibernate获取ConstraintViolationException

Java 多对多映射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(

这是相关的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(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)