Дочерние объекты не выбираются с родительским объектом в Spring-Data - PullRequest
0 голосов
/ 26 сентября 2019

Я довольно новичок в Hibernate, я установил двунаправленные отношения @OneToMany между родительскими и дочерними объектами и ожидаю, когда я сохраню все в БД, установив родительский объект в дочерний объект (потому что дочерний объект является владельцемотношения), и когда я получаю родительский объект с помощью ORM, я ожидаю также получить дочерний объект, но взамен я вижу ноль дочерних объектов.

Насколько я понял из того, что я уже прочитал в Интернете, когда я сохраняю дочерний объект как владельца отношений с родительским целым, ORM должен совершать магию соединения двух объектов в соответствии спредопределенное отображение отношений.Является ли эта информация правильной?

@Entity
@Table(name = "stream")
@SequenceGenerator(name = "sequence", sequenceName = "stream_id", allocationSize = 1)
public class StreamEntity extends EntityWithId {

    // @MappedSuperclass with ID 

    @Column(name = "request_id")
    @OneToMany(
            mappedBy = "streamEntity",
            fetch = FetchType.LAZY
    )
    private List<RequestEntity> requestEntities = new ArrayList<>();

    // getters setters
}

@Entity
@Table(name = "request")
@SequenceGenerator(name = "sequence", sequenceName = "request_id", allocationSize = 1, initialValue = 1)
public class RequestEntity extends EntityWithId {

    // @MappedSuperclass with ID 

    @JoinColumn(name = "stream_id")
    @ManyToOne(fetch = FetchType.LAZY)
    private StreamEntity streamEntity;

    // getters setters
}

Некоторые тесты:

@Test
public void createStreamWithSeveralStreamTargetsAndDeleteStream() {
    List<StreamEntity> streamEntities = createStream(1); // stream object is persisted here

    List<RequestEntity> requestEntitySave = createRequest(1, streamEntityCheck);
    assertEquals(1, requestEntitySave.size()); // request entity is persisted with the stream object into the database

    List<StreamEntity> streamEntities = streamDao.findAll();
    assertEquals(1, streamEntities.size());
    StreamEntity streamEntity2 = streamEntities.get(0);
    streamEntity2.getRequestEntities(); - this collection shows 0
}

Что мне не хватает?

Обновление: как предложил @Alan Hay, я добавил @Постоянный контекст в моем тесте теперь выглядит следующим образом:

@PersistenceContext
    private EntityManager em;


@Test
    public void createStreamWithSeveralStreamTargetsAndDeleteStream() {
        List<StreamEntity> streamEntities = createStream(1); // stream object is persisted here

        List<RequestEntity> requestEntitySave = createRequest(1, streamEntityCheck);
        assertEquals(1, requestEntitySave.size()); // request entity is persisted with the stream object into the database

        em.clear();

List<RequestEntity> requestEntities = requestDao.findAll();
        assertEquals(1, requestEntities.size()); // retirns zero objects

        List<StreamEntity> streamEntities = streamDao.findAll();
        assertEquals(1, streamEntities.size());
        StreamEntity streamEntity2 = streamEntities.get(0);
        streamEntity2.getRequestEntities();// this collection shows 0
    }

После того, как я это сделал, я получаю ноль объектов в requestDao.findAll ();шаг.Я передал эти изменения на предыдущем шаге, почему я не могу получить эту сущность?

1 Ответ

0 голосов
/ 26 сентября 2019

Из-за концепции кэша 1-го уровня, исходный объект, который вы создали и сохранили, и тот, который вы загрузили, - это один и тот же экземпляр.Поскольку вы не добавили созданный объект запроса в модель в памяти, а просто сохранили его в базе данных, в модели в памяти не существует взаимосвязи.

Чтобы получить желаемый результат, необходимо очиститьпостоянный контекст между сохранением и перезагрузкой.

@Test
    public void createStreamWithSeveralStreamTargetsAndDeleteStream() {
        List<StreamEntity> streamEntities = createStream(1); 

        List<RequestEntity> requestEntitySave = createRequest(1, streamEntityCheck);
        assertEquals(1, requestEntitySave.size()); 

        //you need to clear the persistence context here
        //now a db query should execute.
        //Inject the entitymanager to your test @PersistenceContext EntityManager em;
        em.clear();

        List<StreamEntity> streamEntities = streamDao.findAll();
        assertEquals(1, streamEntities.size());
        StreamEntity streamEntity2 = streamEntities.get(0);
        streamEntity2.getRequestEntities(); - this collection shows 0

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