1

spring roo 生成コントローラーを使用しています。マッピングは次のように定義されています。

Class users 
    private String username;
    private String password;

 @ManyToMany( fetch = FetchType.EAGER) 
   @Cascade( org.hibernate.annotations.CascadeType.SAVE_UPDATE)
   @JoinTable(name = "user_roles", 
        joinColumns = { @JoinColumn(name = "users_id") }, 
        inverseJoinColumns = { @JoinColumn(name = "roles_id") })
    private Set<Authority> roles = new HashSet<Authority>();

Class Authority 
    private String roles
    private String descricao;

@ManyToMany( fetch = FetchType.EAGER ,  mappedBy = "roles") 
    @Cascade( org.hibernate.annotations.CascadeType.SAVE_UPDATE )
    private Set<Users> users = new HashSet<Users>();

関係は機能しています。つまり、このテーブル "Users" とテーブル サービス "Users_roles" にデータが入力されていますが、実際に権限が期待されるテーブルではありません。

Spring roo によって生成された方法で、データの永続化は完璧に進んでいます。この方法でコントローラーのユーザーは機能します。

    Users users = Users.fromJsonToUsers(json);
    users.persist();

この問題は、関係を使用してメソッドを介して検索を実行しようとしたときに発生しました。

StringBuilder queryBuilder = new StringBuilder("SELECT o FROM Users AS o WHERE LOWER(o.username) LIKE LOWER(:username)  AND LOWER(o.password) LIKE LOWER(:password)");
        queryBuilder.append(" OR");
        for (int i = 0; i < roles.size(); i++) {
            if (i > 0) queryBuilder.append(" AND");
            queryBuilder.append(" :roles_item").append(i).append(" MEMBER OF o.roles");
        }
        TypedQuery<Users> q = em.createQuery(queryBuilder.toString(), Users.class);
        q.setParameter("username", username);
        int rolesIndex = 0;
        for (Authority _authority: roles) {
            q.setParameter("roles_item" + rolesIndex++, _authority);
        }
        q.setParameter("password", password);
        return q;

次のようなクエリを作成します。

(
  SELECT o
  FROM Users AS o 
  WHERE LOWER(o.username) LIKE LOWER(:username)
  AND LOWER(o.password) LIKE LOWER(:password)
  OR :roles_item0 MEMBER OF o.roles
)

例外:

org.springframework.dao.InvalidDataAccessApiUsageException: org.hibernate.Transi
entObjectException: **object references an unsaved transient instance - save the t
ransient instance before flushing:** br.teste.carro.domain.Authority; neste
d exception is java.lang.IllegalStateException: org.hibernate.TransientObjectExc
eption: object references an unsaved transient instance - save the transient ins
tance before flushing: br.teste.carro.domain.Authority

問題は保存方法にあると思いますが、よくわかりません。どなたか力になっていただけるとありがたいです。

4

1 に答える 1

1

relp の両側で結合列を指定する必要があり、反対側では逆にする必要があります。

Class users 
@JoinTable(name = "user_roles", 
    joinColumns = { @JoinColumn(name = "users_id") }, 
    inverseJoinColumns = { @JoinColumn(name = "roles_id") })


Class Authority 
@JoinTable(name = "user_roles", 
    joinColumns = { @JoinColumn(name = "roles_id") }, 
    inverseJoinColumns = { @JoinColumn(name = "users_id") })
于 2012-09-02T09:29:02.013 に答える