0

データベース(MySQL V5.1.61)にタグ付けシステムを実装し、それを休止状態で機能させようとしています。これが私のデータベースの関連部分です: スキーマ

そして含まれているデータ: ユーザーテーブル

ユーザータグ

タグ

私がこれを正しく行っている場合、「nir」には、「Food」、「Sorority」、および「SummerInternship」の3つのタグが関連付けられている必要があります。

私が問題を抱えているのは、この関係を休止状態で実装することです(アノテーションを使用):

UserHibernateクラス(私はGWTを使用しているので、別々の休止状態オブジェクトとDTOオブジェクトが必要です):

@Entity
@Table(name="user")
public class UserHibernate implements Serializable{

    private int ID;
    //removed fields for brevity
    private Set<UserTagsHibernate> tags;


    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name = "uID")
    public int getID() {
        return ID;
    }

    public void setID(int iD) {
        ID = iD;
    }

    /**
     * @return the tags
     */
    @OneToMany(mappedBy="user", fetch=FetchType.EAGER)
    public Set<UserTagsHibernate> getTags() {
        return tags;
    }
    /**
     * @param tags the tags to set
     */
    public void setTags(Set<UserTagsHibernate> tags) {
        this.tags = tags;
    }


}

UserTagsHibernateクラス:

@Entity
@Table(name="usertags")
public class UserTagsHibernate {
    private int usertagsID;
    private UserHibernate user;
    private TagsHibernate tags;

    @ManyToOne(fetch=FetchType.EAGER)
    @JoinColumn(name="userforeignkey")
    public UserHibernate getUser() {
        return user;
    }
    public void setUser(UserHibernate userHibernate) {
        this.user = userHibernate;
    }

    @OneToOne
    @JoinColumn(name="tagforeignkey")
    public TagsHibernate getTags() {
        return tags;
    }
    public void setTags(TagsHibernate tagsHibernate) {
        this.tags = tagsHibernate;
    }

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name = "usertagsID")
    public int getUsertagsID() {
        return usertagsID;
    }
    public void setUsertagsID(int usertagsID) {
        this.usertagsID = usertagsID;
    }



}

tagsHibernateクラス:

@Entity
@Table(name = "tags")
public class TagsHibernate {
    private int tagID;
    //removed for brevity

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "tagID")
    public int getTagID() {
        return tagID;
    }

    public void setTagID(int tagID) {
        this.tagID = tagID;
    }

}

私が抱えている問題は、ユーザー(ここでは「nir」)を取得しようとすると、3回表示されることです。彼には3つのタグがあるためだと思います。そのため、何らかの理由で、クエリ "session.createCriteria(UserHibernate.class).add(Restrictions.eq(" username "、" nir "))。list();を発行します。 「」長さ3のリストを取得します。なぜこれが起こっているのか考えてみてください。

4

1 に答える 1

1

この問題は、CriteriaAPIを使用しているときに常に発生します...これは既知の癖です。回避策は、代わりにHQLを使用するか、次のように重複を除外するトランスフォーマーを追加することです。

session.createCriteria(UserHibernate.class)
    .add(Restrictions.eq("username", "nir"))
    .setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY)
    .list();
于 2012-12-19T19:11:21.670 に答える