Отображение полей условно с Hibernate - PullRequest
0 голосов
/ 19 марта 2019

У меня есть Food объект, который имеет отношение один ко многим с другими Food объектами (через поле ingredients), и большую часть времени я хочу загрузить ingredients с родителем Food объект. Однако, когда я загружаю объект Food, его ingredients, затем их ingredients, затем их ingredients, ad nauseam. Есть ли способ предотвратить рекурсивную загрузку Hibernate ingredients и вместо этого просто загрузить базовую информацию Food объектов (например, id и type)?

Питание

@Entity
@Table(name="Foods")
public class Food { 
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="Id")
    private int id;

    @Column(name="Name")
    private String name;

    @Column(name="Description")
    private String description;

    @OneToMany(mappedBy="food")
    private List<Ingredient> ingredients;
    .
    .
    .

Ингредиент

@Entity
@Table(name="Ingredients")
public class Ingredient implements Serializable {       
    @Id
    @ManyToOne
    @JoinColumn(name="FoodId")
    private Food food;

    @Id
    @ManyToOne
    @JoinColumn(name="IngredientId")
    private Food ingredient;

    @Column(name="Amount")
    private int amount;
    .
    .
    .

1 Ответ

0 голосов
/ 19 марта 2019

Загрузка коллекций может быть сделана

  1. , жадно загружая @OneToMany (fetch = FetchType.EAGER).Если атрибут извлечения не указан, тип извлечения по умолчанию - LAZY.В вашем случае тип выборки не вызывает его.
  2. путем доступа к коллекции ингредиентов внутри сессии, hibernate инициализирует / загружает его, используя select from DB.Это может произойти при выполнении итерации коллекции или при вызове food.getIngredients().size() или food.getIngredients().isEmpty() или других методов.

Я предполагаю, что какой-то код обращается к коллекции, и это вызывает ее.

...