java - Hibernate onetomany 中的外键未更新

标签 java mysql spring hibernate jpa

我看过这个问题的很多答案,但由于某种原因,没有一个适合我。我是 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/

相关文章:

具有上界通配符的 Java 泛型

php - 如何将phinx迁移工具与codeception测试框架一起使用

mysql - Mysql中如何检查不等于?

mysql - SQL GROUP_CONCAT 与多个相关行的 LEFT JOIN

spring - Log4j 登录到 STDOUT,然后格式化为 Logstash 的 JSON 布局

java - 如何使用随机数添加 1/100 的机会

java - 让 selenium 等待 - WebDriverWait 问题

java - 从二维 ArrayList 中删除重复项

spring - Thymeleaf 和 Spring 的 bool 条件

java - Spring AOP 并没有注入(inject)所有方面