在我的Spring-Boot应用程序的相应映射表

问题描述:

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

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

} 

休眠给我一个错误消息:

无法添加或更新子行:外键约束失败(projekt_grarole_users,约束fk_roleusers_user外键(users_id)参考文献usersid)ON DELETE CASCADE ON UPDATE CASCADE)

我从this site建设,并与它的工作原理,但在我的代码这是行不通的。

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

一个很好的理由是,当我拥有@ManyToMany关系时,我无法轻易得到我想要的任何东西,因为我得到的是美感产品。把这张表作为一个实体完全消除了这个问题。

所以,包裹起来:

  • 你已经有用户,和你的角色类,这些几乎是OK
  • 创建一个新的实体:UserRole的,与特性:用户用户和角色角色
  • 将两个@ManyToMany更改为用户角色将@ OneToMany's更改为y我们的新@Entity UserRole的
  • 的UserRole添加关系:2 @ManyToOne关系用户角色

你现在已经解决了问题,还有额外的:查询关系UserRole的可能性。

+0

你是指[this](https://hellokoding.com/jpa-many-to-many-extra-columns-relationship-mapping-example-with-spring-boot-maven-and-mysql/)? –

+0

不完全。你有你的用户,和你的角色类。将ManyToMany更改为OneToMany的新实体:UserRole。用2个ManyToOne关系创建用户和角色。你现在已经解决了问题,还有额外的问题:查询关系的可能性。 (我将添加这个到我的答案澄清更多) –

+0

谢谢你的努力。我问公司里的一个朋友,我真的在工作,他帮助了我。我发布了解决方案作为答案。 –

我解决了它! 感谢一位朋友,我解决了我的问题。如果它对某人感兴趣:我试图首先将用户保存在存储库中,然后是角色。而且因为在我想保存用户的那一刻,角色不存在,所以Hibernate给了我那个错误信息。

+0

那么你仍然坚持多到多?现在你在创建用户之前创建了一个角色? – user3388770

+0

是的。我有User.java中的多对多关系,但添加了另一个注释:** @ JoinTable ** –