2017-02-23 14 views
0

私の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; 
} 

マイ実行 -method:

@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_gra)。 role_users、CONSTRAINT fk_roleusers_user FOREIGN KEY(users_id)UPDATE CASCADE ON DELETE CASCADE ON usersid)を参照)

私はthis siteから建設を持っており、それはそれで動作しますが、私のコードでは、それは動作しません。

答えて

1

2ManyToManyリレーションを@OneToManyに書き直すことで、常にこの問題が解決されます。

私は@ManyToManyリレーションシップを持っていると、私は魔法の製品を手に入れているので、私が望むものを得ることは決して簡単にできません。エンティティとしてこのテーブルを間に入れておくと、この問題が完全に解消されます。

ので、アップラップする:のUserRole、プロパティを持つ:

  • あなたはすでにあなたのユーザー、そしてあなたの役割クラスを持って、それらは
  • は新しいエンティティを作成し、ほぼOKです。ユーザユーザとロールロール
  • 2つの@ManyToManyをに変更してください。ユーザロールを@ OneToManyのユーザー役割に2 @ManyToOne関係:当社の新しい@Entity のUserRole
  • のUserRoleに関係を追加します。

問題が解決され、余分に:UserRoleの関係で照会する可能性があります。

+0

[this](https://hellokoding.com/jpa-many-to-many-extra-columns-relationship-mapping-example-with-spring-boot-maven-and-mysql/)のような意味ですか? –

+0

完全ではありません。あなたはあなたのUserとRoleクラスを持っています。 ManyToManyをOneToManyに変更して、新しいエンティティ:UserRoleに設定します。ユーザーと役割に対する2つのManyToOne関係でそれを作成します。あなたは今問題がなくなり、余分に:関係について質問する可能性がある。 (私はこれを私の答えに追加してもっと明確にします) –

+0

ありがとうございました。私は実際に働いている会社の友人に尋ね、彼は私を助けました。答えとして解決策を掲載しました。 –

1

私はそれを解決しました! 友人のおかげで、私は自分の問題を解決しました。それは誰かに興味がある場合:私はリポジトリに最初に、次に役割を保存しようとしました。私のユーザを保存したい瞬間にその役割が存在しないので、Hibernateは私にそのエラーメッセージを与えました。

+0

それでも、あなたはまだ多くの人と多くの人に支持されましたか?今、ユーザーを作成する前にロールを作成しましたか? – user3388770

+0

はい。私はUser.javaに多対多の関係を持っていますが、別の注釈を追加しました:** @ JoinTable ** –

関連する問題