JPA: Entity X имеет отношение OneToMany к себе.Как? - PullRequest
1 голос
/ 27 октября 2010

У меня есть один вызов Entity Comment

Comment
+ id (PK)
+ fromUserId
+ targetId
+ replyId: Это внешний ключ для id

Идея в том, что comment может иметь много ответов, но reply также является comment.Чтобы провести различие между ними, a comment будет иметь replyId, равный -1, а reply будет иметь значение, отличное от -1, для replyId.В конечном счете, я хочу, чтобы Comment имел List подобный этому

List<Comment> replyList;  //So each comment will store all their replies into this List

В JPA я установил OneToMany связь между двумя сущностями, я создаю список с помощью @OneToMany и @ManyToOne аннотация, но в этом случае я не уверен, как это сделать.Пожалуйста, помогите

РЕДАКТИРОВАТЬ
Они способ, которым я создаю комментарий - Макет ответа заключается в том, что одна dataTable находится внутри другой

<h:form id="table">
<p:dataTable value="#{bean.comments}" var="item">
    <!-- Original Comment -->
    <p:column>
        <h:outputText value="#{item.comment}" />
    </p:column>

    <!-- Reply -->
    <p:column>
        <p:dataTable value="#{item.replies}" rendered="#{item.replies.size() > 0}" var="item2">
             <!-- Print out replies in here -->
             <h:outputText value="#{item2.comment}" />
        </p:dataTable>

        <!-- Text box and commandButton so user can add new reply -->
        <h:inputTextarea value="#{...}" />
        <p:commandButton value="Post" actionListener="#{bean.addReply(item)}" />
        <!-- Assume that I got this working, that a new Comment with correct REPLYTO_ID set -->
    </p:column>
</p:dataTable>
</h:form>

Вот моя проблема.Когда я набираю ответ и нажимаю Post, он правильно создает запись элемента в моей базе данных, а после этого вызывает getReplies().В этот момент я предположил, что replies.size() == 1, однако replies.size() равно 0. Поэтому я ничего не вижу.Я должен обновить страницу, чтобы она отображалась правильно.Я как бы вижу проблему здесь, поскольку я сгенерировал значение второй таблицы с помощью #{item.replies}, поэтому, если item не обновляется до даты, то replies не обновляется до даты.Не уверен, что это проблема JSF или JPA

1 Ответ

2 голосов
/ 27 октября 2010

Вы можете отобразить самоссылающуюся сущность следующим образом:

@Entity
public class Comment {
    @Id
    private Long id;

    @ManyToOne(optional=true, fetch=FetchType.LAZY)
    @JoinColumn(name="REPLYTO_ID")
    private Comment replyTo;

    @OneToMany(mappedBy="replyTo")
    private List<Comment> replies = new ArrayList<Comment>();

    //...

    // link management method
    public void addToComments(Comment comment) {
        this.comments.add(comment);
        comment.setParent(parent);
    }
}

Где корень Comment не имеет replyTo.

PS: убедитесь, что правильно установлены двунаправленные ассоциации.

...