2012-12-19 45 views
0

我想在我的數據庫(MySQL V5.1.61)中實現一個標記系統,然後在休眠狀態下工作。這裏是我的數據庫中的相關部分: Schema在Hibernate中使用註解標記系統

而且包含的數據: user table

usertags

tags

如果我正確地這樣做,那麼 'NIR' 應該有3個與他相關的標籤,'食物','Sorority'和'暑期實習'。

什麼我有正在實施的休眠這種關係(使用註釋)麻煩:

的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個標籤,所以出於某種原因,當我發出查詢「session.createCriteria(UserHibernate.class).add(Restrictions.eq(」username「,」nir「))。list(); 「我得到一個長度列表3.任何想法,爲什麼發生這種情況?

回答

1

這個問題在使用Criteria API時總是彈出...這是一個已知的怪癖。解決方法是或者使用HQL代替或者添加一個變壓器來過濾出重複項,如下所示:

session.createCriteria(UserHibernate.class) 
    .add(Restrictions.eq("username", "nir")) 
    .setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY) 
    .list(); 
+0

非常感謝!這是一種討厭,雖然... –

+0

我不能同意你更多!我真的很喜歡Criteria API的想法,但是我幾乎總是最終使用HQL來代替這個問題......要記得告訴Hibernate做預期的事情,感覺非常不好意思。 – stevevls