【问题标题】:save many-to-many relationship in corresponding mapping-table在对应的映射表中保存多对多关系
【发布时间】:2017-07-14 00:13:55
【问题描述】:

在我的 Spring-Boot 应用程序中,我想将 User-Role 多对多关系保存在我数据库中相应的映射表中,但 hibernate 给了我一条错误消息。 p>

我的 User.java 类:

@Entity
@Table(name = "users")
public class User {
  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  Long id;
  String firstname;
  String lastname;
  String username;
  String password;

  @ManyToMany(mappedBy = "users")
  private Set<Role> roles;
}

我的 Role.java 类:

@Entity
@Table(name = "roles")
public class Role {

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  Long id;
  String name;
  String description;

  @ManyToMany(cascade = CascadeType.ALL)
  @JoinTable(
          name = "role_users", 
          joinColumns = 
              @JoinColumn(name = "users_id", referencedColumnName = "id"), 
          inverseJoinColumns = 
              @JoinColumn(name = "roles_id", referencedColumnName = "id")
  )
  private Set<User> users;
}

我的运行-方法:

@Override
@Transactional
public void run(String... strings) throws Exception {
    //add new Roles
    Role roleA = new Role("Rolle A");
    Role roleB = new Role("Rolle B");
    Role roleC = new Role("Rolle C");

    //add new Users
    User userA = new User("FirstnameA", "LastnameA", "UsernameA", "PasswordA");
    User userB = new User("FirstnameB", "LastnameB", "UsernameB", "PasswordB");

    //add new Lists of Roles
    Set<Role> rolesA = new HashSet<Role>();
    rolesA.add(roleA);
    rolesA.add(roleB);
    Set<Role> rolesB = new HashSet<Role>();
    rolesB.add(roleA);
    rolesB.add(roleC);

    //add a list of roles in one user, two times
    userA.setRoles(rolesA);
    userB.setRoles(rolesB);

    //save both users in db
    userRepository.save(userA); //rolle AB
    userRepository.save(userB); //rolle AC

    //give each role the corresponding user
    Set<User> usersA = new HashSet<User>();
    usersA.add(userA);
    usersA.add(userB);
    roleA.setUsers(usersA);
    roleRepository.save(roleA);
    Set<User> usersB = new HashSet<User>();
    usersB.add(userA);
    roleB.setUsers(usersB);
    roleRepository.save(roleB);
    Set<User> usersC = new HashSet<User>();
    usersC.add(userB);
    roleC.setUsers(usersC);
    roleRepository.save(roleC);

}

Hibernate 给了我一个错误信息:

无法添加或更新子行:外键约束失败 (projekt_gra.role_users, CONSTRAINT fk_roleusers_user FOREIGN KEY (users_id) REFERENCES users (id) ON DELETE CASCADE ON UPDATE级联)

我有来自this site 的构造,它可以使用它,但在我的代码中它不起作用。

【问题讨论】:

    标签: java mysql spring hibernate jpa


    【解决方案1】:

    我总是通过将 @OneToMany 的 2 个 @ManyToMany 关系重写为一个新实体来解决这个问题,该实体为我提供中间的表格。

    一个很好的理由是,当我拥有@ManyToMany 关系时,我永远无法真正轻松地得到我想要的任何东西,因为我得到了carthetic 产品。将这张表作为一个实体介于两者之间,对我来说完全消除了这个问题。

    所以,总结一下:

    • 你已经有了你的User和你的Role类,这些都差不多了
    • 创建一个新实体:UserRole,具有属性:用户用户和角色角色
    • UserRole 中的两个@ManyToMany 更改为@OneToMany 的新@Entity UserRole
    • UserRole 中添加关系:2 个 @ManyToOne 关系到 UserRole

    您现在解决了问题,而且还有额外的问题:可以查询关系 UserRole。

    【讨论】:

    • 你的意思是像this
    • 不完全。你有你的用户和你的角色类。将 ManyToMany 更改为 OneToMany 的新实体:UserRole。使用与用户和角色的 2 个多对一关系创建它。您现在解决了问题,而且还有额外的问题:查询关系的可能性。 (我会将此添加到我的答案中以澄清更多)
    • 感谢您的努力。我问了我实际工作的公司的一个朋友,他帮助了我。我发布了解决方案作为答案。
    • @JeroenvanDijk-Jun 我遇到了你提到的方法的问题,你能看看这篇文章吗 - stackoverflow.com/questions/63959365/…
    【解决方案2】:

    我解决了! 感谢一位朋友,我解决了我的问题。如果有人感兴趣:我尝试先将用户保存在存储库中,然后再保存角色。而且由于在我想保存用户的那一刻该角色不存在,Hibernate 给了我该错误消息。

    【讨论】:

    • 所以你还坚持多对多?现在您在创建用户之前创建了一个角色?
    • 是的。我在 User.java 中有一个多对多的关系,但添加了另一个注释:@JoinTable
    猜你喜欢
    • 1970-01-01
    • 2014-08-17
    • 2012-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多