如何使用父/子关系创建@Entity

时间:2010-07-05 23:51:46

标签: java mysql hibernate orm

我正在创建一个有文章的网站;每篇文章都会有评论。这些注释将存储在“注释”表中,其中包含一个名为“parent_id”的字段,该字段是同一表中字段“id”的外键。

我希望使用Hibernate以递归方式获取特定文章的所有注释。

这是我的实体:

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import org.hibernate.annotations.IndexColumn;

@Entity
public class Comment implements Serializable {
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private int id;
    @ManyToOne
    @JoinColumn(name="user_id")
    private User user;
    @OneToMany(targetEntity=Comment.class)
    @JoinColumn(name="parent_id")
    @IndexColumn(name="id", base=0)
    private List<Comment> comments = new ArrayList<Comment>();
    @Column(name="article_id", length=10)
    private int articleId;
    @Column(name="text", length=8192)
    private String text;

    public int getArticleId() {
        return articleId;
    }

    public void setArticleId(int articleId) {
        this.articleId = articleId;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }



    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    @Override
    public String toString() {
        return "Comment [" + "articleId " + articleId + " " + "id " + id + " "  + "text " + text + " " + "]";
    }


}

代码“有点”工作,但是,当检索到所有注释时,“子”注释列表包含与总注释相同数量的元素(如果有意义的话。例如,假设我有对于id为1的文章,表中只有三条评论...这篇文章有2条评论,其中一条评论有一条子评论..带有子评论的数组有3个条目,前两个是空的,最后一条是孩子的评论。

这段代码是否正确?

1 个答案:

答案 0 :(得分:2)

我想知道问题是不是来自您使用PK列作为索引列这一事实。我建议为索引列使用专用列。像这样:

@OneToMany
@JoinColumn(name="parent_id")
@IndexColumn(name="comments_index", base=0)
private List<Comment> comments = new ArrayList<Comment>();

你可以尝试一下吗?