当前位置: 首页 > 知识库问答 >
问题:

在对应的映射表中保存多对多关系

荣德厚
2023-03-14

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

我的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_grarole_users, CONSTRAINTfk_roleusers_userFOREIGN KEY(users_id)REFERENCESuserid)ON DELETE CASCADE ON更新级联

我有这个网站的建设,它与它一起工作,但在我的代码,它不工作。

共有2个答案

曹光霁
2023-03-14

我解决了!多亏了一个朋友,我解决了我的问题。如果有人感兴趣:我尝试先在存储库中保存一个用户,然后保存角色。因为在我想要保存用户的时候角色不存在,Hibernate给了我那个错误消息。

轩辕煜
2023-03-14

我总是通过将2@ManyToMany到@OneToMany的关系重写为一个新实体来传递这个问题,从而将中间的表传递给我。

一个很好的原因是,当我有很多关系时,我从来没有真正容易得到我想要的任何东西,因为我得到了红宝石产品。将这张桌子作为一个实体完全消除了我的这个问题。

因此,总结一下:

  • 您已经拥有了您的用户和角色类,这些几乎都可以

现在问题解决了,还有:可以对关系UserRole进行查询。

 类似资料:
  • 如何用额外的列保存多对多映射对象?专列为“审批”。对于多对多注释,我只调用了setUsersDocuments(users),它工作正常...我怎样才能使它工作与额外的列? 文件 用户类 主键 多对多表 正在保存单据 编辑:unsuccessfull保存对象-Document.GetDocumentsForUsers().Add(userDocuments)null. 编辑:错误 null

  • 问题内容: 我的数据库包含3个表:User和Service实体具有多对多关系,并与SERVICE_USER表联接在一起,如下所示: 用户-SERVICE_USER-服务 SERVICE_USER表包含附加的BLOCKED列。 执行这种映射的最佳方法是什么?这些是我的实体类 我遵循以下示例http://giannigar.wordpress.com/2009/09/04/m … using-jpa

  • 1. 前言 本节课,咱们一起继续聊聊多对多关联映射。通过本节课程,你将了解到: 多对多关联映射的实现; 双向多对多关联映射的实现。 2. 多对多关联映射 首先了解表中的多对多关系,学生表中的数据和课程表中的数据就存在多对多关系。 一名学生可以选修多门课程,一门课程可以供多名学生选修。 数据库通过主外键的机制描述表中的数据之间的关系。对于存在多对多关系的数据表,借助于中间表,分拆成两个一对多(或者多

  • 有两张数据表,通过第三张数据表来表示关联关系,我们称之为多对多的映射 如上图,通过一个中间数据表的两个字段,分别指向两个对象的主键,可以实现多对多映射。所以,Pet.foods(一个 List<Food>) 或者 Food.pets(一个List<Pet>)就是多对多映射。 在 POJO 中配置多对多映射 在 POJO 类中字段中增加注解 @ManyMany: @Table("t_food")

  • 如果在中只有一组,这将非常好地工作。ASSESSMENT_COMMENT只有两列: 它将完美地代表一对多的关系。 现在问题来了: 那么,1)这是Hibernate中已知的bug吗?2)有办法解决这个问题吗?我可以强制Hibernate创建两个映射表,每个映射表一个吗?请记住,我不能更改类来引用(业务逻辑需求)

  • 一个udit.java Chapter.java 审计控制员。JAVA