JPA загружает слишком много данных, даже если fetchtype ленив - PullRequest
0 голосов
/ 08 июня 2018

У меня есть приложение, которое загружает данные, связанные с канализационной сетью.Вот образец вовлеченных лиц.Сначала я определяю объект Network:

@Entity
@Table(name = "network")
public class Network extends Serializable {
  @Id
  @generatedValue(strategy=GenerationType.AUTO)
  private Long id;

  ...
  @OneToMany(mappedBy = "network")
  private List<Conduit> conduits;

  @OneToMany(mappedBy = "network")
  private List<ConduitVolumeter> conduitVolumeters;

  ...
}

Второй задействованный объект - Conduit, представляющий канал в сети.

@Entity
@Table(name = "conduit")
@NamedQuery(name = "Conduit.findAll", query = "SELECT c FROM Conduit c")
public class Conduit extends Serializable {
  @Id
  @generatedValue(strategy=GenerationType.AUTO)
  private Long id;

  ...
  @ManyToOne(fetch = FetchType.LAZY)
  @JoinColumn(name = "id_network", nullable = false)
  private Network network;

  @OneToOne(mappedBy = "conduit", fetch = FetchType.LAZY)
  private ConduitVolumeter conduitVolumeter;

  ...
}

Далее я определяю ConduitVolumeter.Это представляет собой измерительное устройство, используемое для измерения объема в трубопроводе.Поскольку объемы можно измерять в других сетевых элементах, в базе данных есть абстрактный класс Volumeter, связанный с таблицей volumeter.

@Entity(name = "ConduitVolumeter")
@DiscriminatorValue("1")
public class ConduitVolumeter extends Volumeter {

  @OneToOne(fetch = FetchType.LAZY)
  @JoinColumn(name = "id_nme")
  private Conduit conduit;

  ...
}

@Entity
@Table(name = "volumeter")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "nme_type", discriminatorType = DiscriminatorType.INTEGER)
public abstract class Volumeter extends Serializable {
  @Id
  @generatedValue(strategy=GenerationType.AUTO)
  private Long id;

  ...
  @ManyToOne(fetch = FetchType.LAZY)
  @JoinColumn(name = "id_network", nullable = false)
  private Network network;

  ...
}

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

Hibernate: 
    select
        conduit0_.id as id_1_7_,
        conduit0_.name as name23_7_,
        conduit0_.id_network as id_netw39_7_,
    from
        conduit conduit0_ cross 
    join
        network network1_ 
    where
        conduit0_.id_network=?

...

Hibernate: 
    select
        conduitvol0_.id as id2_116_0_,
        conduitvol0_.name as name10_116_0_,
        conduitvol0_.id_network as id_netw15_116_0_,
        conduitvol0_.id_nme as id_nme17_116_0_ 
    from
        volumeter conduitvol0_ 
    where
        conduitvol0_.id_nme=? 
        and conduitvol0_.nme_type=1

Мой вопрос: почему Hibernate пытается загрузить объемные данные?Каждая аннотация @ManyToOne и @OneToOne устанавливается с FetchType.LAZY.Что я пропустил?

Кстати, меня попросили использовать JPA с устаревшей базой данных.Проблема в модели базы данных?Есть ли способ загрузить кабелепроводы без их объемов?

С уважением.

Франсуа

1 Ответ

0 голосов
/ 08 июня 2018

FetchType - это просто подсказка.Это зависит от того, как вы запрашиваете данные, если вы используете методы репозитория spring-data-jpa, такие как findOne или findBy (производные запросы), тогда Lazy должен работать, но если вы используете репозиторий JPA с @Query для метода репозитория и пишитетогда ваш запрос Lazy может не сработать.

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