データベース(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のリストを取得します。なぜこれが起こっているのか考えてみてください。