2010-07-05 100 views
0

我正在創建一個網站,將有文章;每篇文章都會有評論。這些註釋將被存儲在具有稱爲「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的文章...這篇文章有兩條評論,其中一條評論有一條評論......帶孩子的數組評論有3條評論,前兩條爲空,最後一條爲子女評論。

此編碼是正確的?

回答

2

我不知道這個問題是不是來自您使用PK列作爲索引列的事實。我建議爲索引列使用專用列。這樣的事情:

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

你可以試試這個嗎?

+0

謝謝,這似乎解決了我的問題。 – 2010-07-06 11:56:57

+0

@El不客氣,很高興它解決了。 – 2010-07-06 12:13:22

+0

謝謝你乾淨的回答。絕對會嘗試。 – Nabin 2016-06-21 16:20:24