Java Hibernate中带注释的标签系统

Java Hibernate中带注释的标签系统,java,mysql,hibernate,tagging,Java,Mysql,Hibernate,Tagging,我试图在我的数据库(MySQL V5.1.61)中实现一个标记系统,然后在hibernate中实现它。以下是我的数据库的相关部分: 数据包括: 如果我这样做是正确的,那么“nir”应该有3个标签与他相关,“食物”,“女生联谊会”和“暑期实习” 我遇到的问题是在hibernate中实现这种关系(使用注释): UserHibernate类(我正在使用GWT,因此需要单独的hibernate和DTO对象): TagsHibernate类: @Entity @Table(name="userta

我试图在我的数据库(MySQL V5.1.61)中实现一个标记系统,然后在hibernate中实现它。以下是我的数据库的相关部分:

数据包括:

如果我这样做是正确的,那么“nir”应该有3个标签与他相关,“食物”,“女生联谊会”和“暑期实习”

我遇到的问题是在hibernate中实现这种关系(使用注释):

UserHibernate类(我正在使用GWT,因此需要单独的hibernate和DTO对象):

TagsHibernate类:

@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;
    }



}
@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的列表。知道为什么会发生这种情况吗?

在使用Criteria API时,这个问题总是会出现……这是一个已知的怪癖。解决方法是使用HQL替代,或者添加一个转换器来过滤重复项,如下所示:

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

我完全同意你的意见!我真的很喜欢CriteriaAPI的想法,但由于这个问题,我几乎总是使用HQL来代替它……必须记住告诉Hibernate去做预期的事情,这让我感觉非常不舒服。
session.createCriteria(UserHibernate.class)
    .add(Restrictions.eq("username", "nir"))
    .setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY)
    .list();