2

私はHibernateを使用して、権利管理のために永続化されたデータにアクセスしようとしていますが、非常に新しく、必要なデータを取得するのに苦労しています。

IDと名前のUsersテーブル、IDと名前のGroupsテーブル、およびリンクされているグループIDとユーザーIDのみで構成されるUser/Groupsマッピングがあります。

私がやりたいのは、特定のグループのメンバーのすべての名前を取得することです。したがって、実行したい標準のSQLクエリは次のとおりです。

SELECT 
    u.NAME
FROM 
    USERS u
JOIN
    GROUP_USERS gu
ON
    u.ID = gu.USER_ID
JOIN
    GROUPS g
ON
    gu.GROUP_ID = g.ID
WHERE
     g.NAME = 'test'

しかし、何時間も見て遊んでいたにもかかわらず、私はどこにも行けないようです。

基準がより明確に見えるので、基準を使用したいので、私のコードは次のとおりです。

@Override
public final List<String> getGroupMembers(final String groupName) {
    @SuppressWarnings("unchecked")
    List<User> groupUsers = getHibernateTemplate().execute(new HibernateCallback<List<User>>() {

                @Override
                public List<User> doInHibernate(Session session) throws HibernateException, SQLException {
                    Criteria criteria = session.createCriteria(User.class)
                        .setFetchMode("GroupUsers", FetchMode.JOIN)
                        .setFetchMode("Group", FetchMode.JOIN)
                        .add(Restrictions.eq("name", groupName));
                    return criteria.list();
                }
            });

    List<String> groupUsernames = new ArrayList<String>();
    for (User groupUser : groupUsers) {
        groupUsernames.add(groupUser.getName());
    }
    return groupUsernames;
}

しかし、私がそれをテストすると、結果セットは空になり、ログによると、実行されたクエリは次のようになります。

select this_.ID as M1_4_0_, this_.NAME as M2_4_0_ from USERS this_ where this_.NAME=?

Hibernateにhibernate.hbm2ddl.autoを使用してテーブルを作成させましたが、テーブルが確実にHibernateが期待するとおりになるように削除しましたが、データはクリーンアップされていません。

基準についての助けをいただければ幸いです。よろしくお願いします。

編集:私はxmlマッピングファイルを使用しています:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="com.company">
    <class name="com.company.Group" table="GROUPS">
        <id name="id" column="ID" type="int">
            <generator class="identity"/>
        </id>
        <property name="name" column="NAME" type="java.lang.String" unique="true" not-null="true"/>
    </class>
</hibernate-mapping>

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="com.company">
    <class name="com.company.GroupUsers" table="GROUP_USERS">
        <composite-id>
            <key-many-to-one name="groupId" class = "Group" column="GROUP_ID" />
            <key-many-to-one name="userId" class = "User" column="USER_ID" />
        </composite-id>
    </class>
</hibernate-mapping>

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="com.company">
    <class name="com.company.User" table="USERS">
        <id name="id" column="ID" type="int">
            <generator class="identity"/>
        </id>
        <property name="name" column="NAME" type="java.lang.String" unique="true" not-null="true"/>
    </class>
</hibernate-mapping>
4

2 に答える 2

4

ユーザーグループテーブルをマップする必要はありません。ユーザーとグループの関係を多対多の関係として定義するだけです。多対多の関係をマップする方法について、これこれを見てください。

あなたの場合、それは次のようになります:

<hibernate-mapping package="com.company">
  <class name="com.company.User" table="USERS">

    <id name="id" column="ID" type="int">
        <generator class="identity"/>
    </id>
    <property name="name" column="NAME" type="java.lang.String" unique="true" not-null="true"/>

<many-to-many name="userGroups"
    target-entity="com.company.Group">
   <join-table name="YOUR_USER_GROUP_TABLE">
    <join-column name="USER_ID" />
    <inverse-join-column name="GROUP_ID" />
   </join-table>
</many-to-many>

</class>

また、グループエンティティの名前フィールドを使用してユーザーをフィルタリングするには、次のようにします。

Criteria criteria = session.createCriteria(User.class);  
criteria.createAlias("userGroups", "usrGrp",CriteriaSpecification.LEFT_JOIN); 
criteria.add( Restrictions.eqProperty("usrGrp.name", "test") )
于 2012-09-03T16:59:46.463 に答える
0

オブジェクトをテーブルにマップする方法は、ORMとしてHibernateを使用してもメリットがありません。よりオブジェクト指向のモデルを考えてみましょう。例:

class Group {
  private Set<User> users;
  // ...
}

class User {
  private Set<Group> groups;
  //..
}

つまり、古典的な多対多の関連付けがあります。ここでは、Hibernateを使用したそのようなマッピングの例を見つけることができます。

于 2012-09-03T16:44:09.683 に答える