Когда список @OneToMany заполняется в платформе Play? - PullRequest
1 голос
/ 13 января 2011

Фреймворк Play Еще один пример движка блога имеет класс Post с детьми Комментарии:

// Post.java
// ... other fields, etc.
@OneToMany(mappedBy="post", cascade=CascadeType.ALL)
public List<Comment> comments;
// ...


Когда данные заполняются .yml, кажется, что все работает нормально:

// BasicTest.java
@Test
public void fullTest() {
    Fixtures.load("data.yml");
    // ...
    // Find the most recent post
    Post frontPost = Post.find("order by postedAt desc").first();
    assertNotNull(frontPost);
    // ...
    // Check that this post has two comments
    assertEquals(2, frontPost.comments.size()); // succeeds
}


Но когда я вручную сохраняю сообщение и некоторые комментарии в базе данных, поле frontPost.comments становится пустым:

@Test
public void myFullTest() {
    // Fixtures.load("data.yml");

    User u = new User("bob@gmail.com", "secret", "Bob").save();
    Post p = new Post(u, "About the model layer", "The model has a central position in a Play! application. It is the ...").save();

    Comment c1 = new Comment(p, "Guest", "You are right !").save();
    Comment c2 = new Comment(p, "Mike", "I knew that ...").save();

    // Find the most recent post
    Post frontPost = Post.find("order by postedAt desc").first();

    // This assertion fails as frontPost.comments is empty:
    // "Failure, expected:<2> but was <0>"
    assertEquals(2, frontPost.comments.size());
}


Почему это происходит, и как я могу заставить JPA заполнять поле Post.comments при сохранении классов по одному?

Спасибо всем!

Обновление: решение было вызвать JPA.em (). Clear () перед вызовом find (....).

Ответы [ 2 ]

1 голос
/ 31 октября 2011

Вы хотите вызывать em.refresh (p) вместо очистки контекста персистентности whole и отсоединения всех других объектов.

Это, однако, включает в себя запросы к БД, поэтому Play позже реализует вспомогательный метод в руководстве, который обновит сущность в памяти после сохранения нового комментария, чтобы сэкономить вам поездку.

0 голосов
/ 13 января 2011

При использовании двунаправленных отношений в JPA поддержание согласованности между обеими сторонами отношений для объектов в памяти зависит от вас.

Я не уверен, как Play Framework реализует find(), но если frontPost - это тот же экземпляр, что и p (т. Е. Не свежий экземпляр, созданный из данных базы данных), его коллекция comments определенно пуста.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...