2017-01-02 3 views
0

happy new year :)Lazy инициализация весной DataJPA

У меня есть проект Spring MVC с использованием Hibernate и DataJPA.

@ManyToOne(fetch = FetchType.EAGER) 
@JoinColumn(name = "user_id", nullable = false) 
private User user; 

@ManyToOne(fetch = FetchType.EAGER) 
@JoinColumn(name = "restaurant_id", nullable = false) 
@NotNull 
private Restaurant restaurant; 

Как вы можете видеть, вот два поля с нетерпением. Я хочу сделать и ленивым. Мне нужно, чтобы пользователь @NamedEntityGraph аннотации Ася сделала здесь:

@NamedQueries({ 
    @NamedQuery(name = Restaurant.GET_BY_ID, query = "SELECT r FROM Restaurant r WHERE r.id=?1"), 
    }) 
    @Entity 
    @NamedEntityGraph(name = Restaurant.GRAPH_WITH_MENU_HISTORY, attributeNodes = {@NamedAttributeNode("menuHistory")}) 
    @Table(name = "restaurants") 
    public class Restaurant extends NamedEntity { 

     @OneToMany(cascade = CascadeType.REMOVE, fetch = FetchType.LAZY, mappedBy = "restaurant") 
     @OrderBy(value = "date DESC") 
     private List<Dish> menuHistory; 

     public static final String GRAPH_WITH_MENU_HISTORY = "Restaurant.withMenuHistory"; 

Я хочу знать, если я напишу

@NamedEntityGraph(name = "G_NAME", attributeNodes = {@NamedAttributeNode("user", "restaurant")}) 

и если я буду просить один из них, будет ли вторая нагрузка в любом случае или он будет загружаться только по его просьбе? Может быть, мне нужно, чтобы у пользователя были два графика?

+0

«если я попрошу один из них» - один из них? «будет вторая загрузка в любом случае» - что будет загружаться в любом случае? «или он будет загружать только по его просьбе» - кому? :) Сделайте вопрос более явным. – djxak

+0

@djxak Я имею в виду классы полей «пользователь» и «ресторан» :) – Nicolazz92

+0

Как вы могли бы запросить объект, состоящий из полей 'user' и' restaurant'? Где ваш * код репозитория *? – djxak

ответ

0

В соответствии с JPA 2.1 Spec 3.7.4:

Поставщик настойчивости разрешается получать дополнительное состояние лица за пределы, которые указаны в выборки графика или графика нагрузки. Требуется, однако, , чтобы поставщик персистентности извлекал все состояние, заданное графом выборки или загрузки.

Так что фактически @NamedEntityGraph просто гарантирует, что поля должны быть загружены, но не какие поля не должны загружаться.

Так что, если вы сделаете @NamedEntityGraph с user, поставщик настойчивость (Hibernate, например) можно загрузить только user поле или как user и restaurant поля с нетерпением. Это зависит от реализации и не гарантируется.

См. this проблема спящего режима.

Но, насколько мне известно, Hibernate загружает только простые поля в дополнение к указанному в @NamedEntityGraph и не загружает ленивые ассоциации.

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

Но, конечно, вам нужно два отдельных @NamedEntityGraph s для user и restaurant полей.

Или вы можете использовать ad-hocspring-data-jpa «s особенность:

@Repository 
public interface GroupRepository extends CrudRepository<GroupInfo, String> { 

    @EntityGraph(attributePaths = { "members" }) 
    GroupInfo getByGroupName(String name); 

} 

С помощью этого кода вам не нужно явно объявлять @NamedEntityGraph больше. Вы можете просто указать поля inline.

+0

Большое спасибо! – Nicolazz92

Смежные вопросы