Стремитесь получить определенное ленивое свойство для определенного объекта - PullRequest
0 голосов
/ 05 декабря 2018

У меня есть следующая модель:

@Table(name = "foo")
public class Foo {

    @ManyToOne(fetch = FetchType.LAZY)
    private Bar bar;

}

Используя Entity Framework в .NET в аналогичной ситуации, я мог бы охотно привести свойство Bar с чем-то вроде:

context.Foo.Include(f => f.bar).First()

Есть ли что-нибудь эквивалентное Hibernate?

Моя ситуация такова, что я сохраняю объект с ленивым свойством в сеанс на моем сервере.Затем, когда я получаю свойства сеанса, я не могу получить доступ к ленивому свойству, поскольку сеанс Hibernate уже пропал.Я не могу поставить это свойство как EAGER, поскольку оно унаследовано от @MappedSuperclass, используемого многими другими классами.

Спасибо за любую помощь.

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

Вы можете использовать запрос JPQL с FETCH JOIN:

List<Foo> l = em.createQuery(
    "SELECT f FROM Foo f JOIN FETCH f.bar", Foo.class)
    .getResultList();

Таким образом, все экземпляры класса Foo будут загружены со всеми уже извлеченными экземплярами Bar.Вы можете настроить запрос в соответствии с вашими потребностями.

0 голосов
/ 05 декабря 2018
  1. JPA EntityGraph :

    @Entity
    @Table(name = "foo")
    @NamedEntityGraph(name = "foo.bar",
            attributeNodes = @NamedAttributeNode("bar")
    )
    public class Foo {
    
        @ManyToOne(fetch = FetchType.LAZY)
        private Bar bar;
    
    }
    
    Foo foo = entityManager.find(
        Foo.class,
        id,
        Collections.singletonMap(
            "javax.persistence.fetchgraph",
            entityManager.getEntityGraph("foo.bar")
        )
    );
    

    Вы можете увидеть другой пример и более подробное объяснение там .

  2. Профили гибернации :

    @Entity
    @Table(name = "foo")
    @FetchProfile(
        name = "foo.bar",
        fetchOverrides = {
            @FetchProfile.FetchOverride(
                entity = Employee.class,
                association = "projects",
                mode = FetchMode.JOIN
            )
        }
    )
    public class Foo {
        @ManyToOne(fetch = FetchType.LAZY)
        private Bar bar;
    }
    
    
    session.enableFetchProfile("foo.bar");
    Foo foo = session.byId(Foo.class).load(id);
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...