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