Java 在对应的映射表中保存多对多关系
在我的Spring Boot应用程序中,我想将用户角色多对多关系保存在数据库中相应的映射表中,但hibernate给了我一条错误消息 MyUser.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
@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关系
多亏了一个朋友,我解决了我的问题。如果有人感兴趣:我尝试先在存储库中保存一个用户,然后保存角色。因为在我想要保存我的用户时,角色不存在,Hibernate给了我那个错误消息。你是说喜欢吗?不完全是。您有您的用户和您的角色类。将ManyToMany更改为OneToMany,以创建新实体:UserRole。创建与用户和角色的2个多通关系。现在问题已经解决了,还有一个额外的问题:可以查询关系。(我将在回答中补充这一点以进一步澄清)感谢您的努力。我问了我公司的一位朋友,他帮了我。我发布了解决方案作为答案。@JeroenvanDijk Jun你提到的方法我面临一个问题,你能看一下这篇文章吗?你的意思是喜欢?不完全是。您有您的用户和您的角色类。将ManyToMany更改为OneToMany,以创建新实体:UserRole。创造