Доступ к членам связанной сущности @OneToOne в прослушивателе событий POST_LOAD - PullRequest
0 голосов
/ 10 мая 2018

У меня есть две сущности, которые похожи на это:

EntityA:

@Entity
@Getter
@Setter
@Table(name = "TABLE_A")
    public class EntityA implements SomeInterface {

    @Id
    @Column(name = "A_ID")
    private Long id;

    @OneToOne(mappedBy = "entityA")
    private EntityB entityB;

    @ManyToOne
    @JoinColumn(name = "A_C_ID")
    private EntityC entityC;

    ...
    some other fields

    @Override
    public EntityC retrieveEntityC() {
        return getEntityC();
    }
}

EntityB:

@Entity
@Getter
@Setter
@Table(name = "TABLE_B")
public class EntityB implements SomeInterface {

    @Id
    @Column(name = "B_ID")
    private Long id;

    @OneToOne(fetch = FetchType.EAGER, optional = false)
    @JoinColumn(name = "B_A_ID", unique = true, nullable = false)
    private EntityA entityA;

    ...
    some other fields

    @Override
    public EntityC retrieveEntityC() {
        return getEntityA().retrieveEntityC();
    }
}

Я реализовал прослушиватель событий Hibernate типа POST_LOAD. Когда Hibernate пытается загрузить EntityA, он сначала запускает загрузку своего дочернего объекта - entityB. Когда entityB загружен, вызывается событие POST_LOAD и вызывается мой прослушиватель событий (в контексте EntityB). В моем слушателе я вызываю метод retrieveEntityC () ​​от entityB, который вызывает метод retrieveEntityC () ​​от entityA, чтобы наконец получить entityC от entityA. Проблема в том, что я получаю NULL вместо точного объекта entityC. Объект entityA - это просто прокси, с заполненным только полем id, а для других полей установлено значение NULL. Вызов метода получения не приводит к извлечению объекта из базы данных, как я подозреваю.

В этом сценарии есть ли способ заставить Hibernate действительно получить entityC из базы данных?

...