【问题标题】:How to create an @Entity with a parent/child relationship如何创建具有父/子关系的@Entity
【发布时间】:2011-03-12 02:21:19
【问题描述】:

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

我希望使用 Hibernate 递归地获取特定文章的所有 cmets。

这是我的实体:

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 + " " + "]";
    }


}

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

这段代码正确吗?

【问题讨论】:

    标签: java mysql hibernate orm


    【解决方案1】:

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

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

    你可以试试这个吗?

    【讨论】:

    • 感谢您的干净回答。一定要试试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多