2017-02-23 26 views
0

中保存多對多關係我想在我的數據庫的相應映射表中保存一個用戶角色多對多關係,但是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建設,並與它的工作原理,但在我的代碼這是行不通的。

回答

1

我總是通過將@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

謝謝你的努力。我問公司裏的一個朋友,我真的在工作,他幫助了我。我發佈瞭解決方案作爲答案。 –

1

我解決了它! 感謝一位朋友,我解決了我的問題。如果它對某人感興趣:我試圖首先將用戶保存在存儲庫中,然後是角色。而且因爲在我想保存用戶的那一刻,角色不存在,所以Hibernate給了我那個錯誤信息。

+0

那麼你仍然堅持多到多?現在你在創建用戶之前創建了一個角色? – user3388770

+0

是的。我有User.java中的多對多關係,但添加了另一個註釋:** @ JoinTable ** –

相關問題