Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.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 在对应的映射表中保存多对多关系_Java_Mysql_Spring_Hibernate_Jpa - Fatal编程技术网

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

Java 在对应的映射表中保存多对多关系,java,mysql,spring,hibernate,jpa,Java,Mysql,Spring,Hibernate,Jpa,在我的Spring Boot应用程序中,我想将用户角色多对多关系保存在数据库中相应的映射表中,但hibernate给了我一条错误消息 MyUser.java类: @Entity @Table(name = "users") public class User { @Id @GeneratedValue(strategy = GenerationType.AUTO) Long id; String firstname; String lastname; String use

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

MyUser.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;
}
@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;
}
@实体
@表(name=“users”)
公共类用户{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
长id;
字符串名;
字符串lastname;
字符串用户名;
字符串密码;
@多人(mappedBy=“用户”)
私人设定角色;
}
我的角色.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;
}
@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;
}
@实体
@表(name=“roles”)
公共阶级角色{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
长id;
字符串名;
字符串描述;
@多个(级联=级联类型.ALL)
@可接合(
name=“角色\用户”,
joinColumns=
@JoinColumn(name=“users\u id”,referencedColumnName=“id”),
反向连接列=
@JoinColumn(name=“roles\u id”,referencedColumnName=“id”)
)
私人用户;
}
我的跑步-方法:

@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);

}
@覆盖
@交易的
公共无效运行(字符串…字符串)引发异常{
//添加新角色
角色roleA=新角色(“Rolle A”);
角色roleB=新角色(“Rolle B”);
Role roleC=新角色(“Rolle C”);
//添加新用户
用户userA=新用户(“FirstnameA”、“LastnameA”、“UsernameA”、“PasswordA”);
用户userB=新用户(“FirstnameB”、“LastnameB”、“UsernameB”、“PasswordB”);
//添加新的角色列表
Set rolesA=新的HashSet();
添加(roleA);
添加(roleB);
Set rolesB=newhashset();
添加(roleA);
添加(roleC);
//在一个用户中添加两次角色列表
userA.setRoles(rolesA);
userB.setRoles(rolesB);
//在数据库中保存两个用户
userRepository.save(userA);//rolle AB
userRepository.save(userB);//rolle AC
//为每个角色指定相应的用户
Set usersA=new HashSet();
添加(userA);
usersA.add(userB);
roleA.setUsers(usersA);
roleRepository.save(roleA);
Set usersB=new HashSet();
usersB.add(userA);
角色b.setUsers(usersB);
roleRepository.save(roleB);
Set usersC=new HashSet();
usersC.add(userB);
roleC.setUsers(usersC);
roleRepository.save(roleC);
}
Hibernate向我提供了一条错误消息:

无法添加或更新子行:外键约束失败(
projekt_-gra
role_-users
,约束
fk_-roleusers_-user
外键(
users_-id
)引用
用户
id
)在更新级联时删除级联)


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

我总是通过将2@manytomy关系重写为@OneToMany来传递这个问题,并将其传递给一个新的实体,该实体为我提供了中间的表

一个很好的理由是,当我有@manytomy关系时,我永远无法真正轻松地得到我想要的任何东西,因为我得到的是人工制品。把这个表作为一个实体放在中间完全消除了这个问题

因此,总结一下:

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

现在问题已经解决了,还有一个额外的问题:可以查询关系UserRole。

我总是通过将2@ManyToMany关系重写为@OneToMany来传递这个问题,并将其传递给一个新的实体,该实体将在两者之间传递表

一个很好的理由是,当我有@manytomy关系时,我永远无法真正轻松地得到我想要的任何东西,因为我得到的是人工制品。把这个表作为一个实体放在中间完全消除了这个问题

因此,总结一下:

  • 你已经有了你的用户,还有你的角色类,这些都差不多了
  • 创建一个新实体:UserRole,属性为:User-User和Role-Role
  • 用户角色中的两个@ManyToMany更改为@OneToMany,以创建新的@Entity用户角色
  • 用户角色中的关系添加到用户和角色中:2@manytone关系
现在问题已经解决了,另外:可以查询关系UserRole。

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

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

你是说喜欢吗?不完全是。您有您的用户和您的角色类。将ManyToMany更改为OneToMany,以创建新实体:UserRole。创建与用户和角色的2个多通关系。现在问题已经解决了,还有一个额外的问题:可以查询关系。(我将在回答中补充这一点以进一步澄清)感谢您的努力。我问了我公司的一位朋友,他帮了我。我发布了解决方案作为答案。@JeroenvanDijk Jun你提到的方法我面临一个问题,你能看一下这篇文章吗?你的意思是喜欢?不完全是。您有您的用户和您的角色类。将ManyToMany更改为OneToMany,以创建新实体:UserRole。创造