У меня есть приложение, которое загружает данные, связанные с канализационной сетью.Вот образец вовлеченных лиц.Сначала я определяю объект 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 с устаревшей базой данных.Проблема в модели базы данных?Есть ли способ загрузить кабелепроводы без их объемов?
С уважением.
Франсуа