我看过这个问题的很多答案,但由于某种原因,没有一个适合我。我是 hibernate 映射的新手,所以不确定我哪里出错了。当我运行下面的代码时,我得到了这个异常。
Releasing statement [com.mysql.jdbc.JDBC4PreparedStatement@1033fef8: insert into user (email, firstname, lastname, PASSWORD, SALT) values ('myemail', 'myfirstname', 'mylastname', '$2a$10$dxzyxqhPFrrj.H3mROcZBOhhdm986gCra/5sHmCN5Y8CdJ8TUY1hu', null)]
Cannot add or update a child row: a foreign key constraint fails (`contact_manager`.`user_roles`, CONSTRAINT `email` FOREIGN KEY (`email`) REFERENCES `user` (`email`))
Releasing statement [com.mysql.jdbc.JDBC4PreparedStatement@598fc658: insert into user_roles (role, email) values ('ADMIN_ROLE', 8)]
我不知道电子邮件值 8 从何而来,但每次运行它都会增加。
@Entity
@Table(name="user")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="userid", unique = true, nullable=false)
private Integer id;
@Column(name="email", unique = true)
private String email;
@OneToMany(fetch = FetchType.EAGER, cascade=CascadeType.ALL, mappedBy = "user")
private Set<UserRole> userRole = new HashSet<UserRole>();
//getters and setters
}
@Entity
@Table(name = "user_roles")
public class UserRole{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "user_role_id", unique = true, nullable = false)
private Integer userRoleId;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "email", nullable = false)
private User user;
//getters and setters
}
public User saveUser(User user) {
Set<UserRole> userRoles = new HashSet<UserRole>();
UserRole role = new UserRole();
role.setRole("ADMIN_ROLE");
role.setUser(user);
userRoles.add(role);
user.setUserRole(userRoles);
sessionFactory.getCurrentSession().save(user);
return user;
}
提前致谢
最佳答案
模型映射和 saveUser 方法有点不正统。 请将模型更改为以下内容:
@Entity
@Table(name="user_model")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.Auto)
private Long id;
@Column(name="email", unique = true)
private String email;
@OneToMany(fetch = FetchType.EAGER, mappedBy = "user")
private Set<UserRole> userRole = new HashSet<UserRole>();
}
@Entity
public class UserRole{
@Id
@GeneratedValue(strategy = GenerationType.Auto)
private Long id;
@ManyToOne
private User user;
@Column(unique = true)
private String name;
}
保存内容时,请确保不要多次创建相同的用户角色。因此,如果您想为用户提供相同的角色,请首先从数据库中读取它。这也应该是标准的工作流程。您可能会在创建用户之前创建有效的用户角色或之后更新它。因此级联对 userRole 关系没有任何意义。@ManyToOne 注释的 fetch Eager 没有效果,因为这是默认值。我建议您不要以这种方式使用 JoinColumn 。 JPA 是一个 OBJECT 关系映射框架,因此数据模型应该基于对象,而不是绑定(bind)到关系数据模型。 其他变化
- 删除了@Table 注释。如果您打算使用自定义命名,请查看命名策略。 user 对象是个异常(exception),因为 user 通常是数据库中的保留字。
- 将 id 更改为 long。我认为没有理由将 Integer 作为键。
- 当您是初学者时,Hibernate 可能更清楚该使用哪种策略
关于java - Hibernate onetomany 中的外键未更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30017162/