Отношения сущностей JPA не заполняются после .persist () - PullRequest
1 голос
/ 13 марта 2011

это образец моих двух сущностей:

@Entity
public class Post implements Serializable {
    @OneToMany(mappedBy = "post", fetch = javax.persistence.FetchType.EAGER)
    @OrderBy("revision DESC")
    public List<PostRevision> revisions;

@Entity(name="post_revision")
public class PostRevision implements Serializable {
    @ManyToOne
    public Post post;

    private Integer revision;

    @PrePersist
    private void prePersist() {
        List<PostRevision> list = post.revisions;

        if(list.size() >= 1)
            revision = list.get(list.size() - 1).revision + 1;
        else
            revision = 1;
    }

Итак, есть «пост», и он может иметь несколько ревизий.Во время сохранения ревизии сущность просматривает список существующих ревизий и находит следующий номер ревизии.Проблема в том, что Post.revisions имеет значение NULL, но я думаю, что оно должно быть заполнено автоматически.Я предполагаю, что в моем исходном коде есть какая-то проблема, но я не знаю где.Вот мой код "персистентности":

Post post = new Post();
PostRevision revision = new PostRevision();
revision.post = post;

em.persist(post);
em.persist(revision);
em.flush();

Я думаю, что после сохранения "поста" он становится "управляемым", и теперь все отношения должны быть заполнены.

Спасибо за помощь!

(Примечание: публичные атрибуты только для демонстрации)

Ответы [ 2 ]

1 голос
/ 14 марта 2011

Преобразование вашей Post сущности в:

@Entity
public class Post implements Serializable {
    @OneToMany(mappedBy = "post", fetch = javax.persistence.FetchType.EAGER)
    @OrderBy("revision DESC")
    public List<PostRevision> revisions = new ArrayList<PostRevision>();

    public void addRevision(PostRevision revision) {
        if (post.revisions.isEmpty()) {
            revision.setRevision(1);
        } else {
            revision.setRevision(post.revisions.get(post.revisions.size() - 1));
        }
        revision.setPost(this);
        getRevisions().add(revision);
    }
}

И убедитесь, что вы используете addRevision, когда хотите добавить ревизию в сообщение. С этим решением вы также должны удалить @PrePersist listener.

1 голос
/ 13 марта 2011

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

Поскольку объекты Hibernate также являются POJO, которые вы будете использовать на других уровнях и в модульных тестах, вы должны убедиться, что инвариантыОК.Например, список ревизий никогда не должен быть нулевым.Сначала он должен быть пустым.

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