У меня есть следующие два аннотированных класса, которые я использую для построения графика:
@Entity
@Table(name = "Edge")
public class Edge
{
/* some code omitted for brevity */
@ManyToOne
@JoinColumn(name = "ixNodeFrom", nullable = false)
private Node _nodFrom;
@ManyToOne
@JoinColumn(name = "ixNodeTo", nullable = false)
private Node _nodTo;
/* some code omitted for brevity */
}
@Entity
@Table(name = "Node")
public class Node
{
/* some code omitted for brevity */
@OneToMany(mappedBy = "_nodTo")
private Set<Edge> _rgInbound;
@OneToMany(mappedBy = "_nodFrom")
private Set<Edge> _rgOutbound;
/* some code omitted for brevity */
}
Теперь, когда я создаю график, я выдаю два запроса для извлечения всех строк из любой таблицы и настройки дочерних/родительских ссылок, для которых мне нужны идентификаторы, хранящиеся в таблице Edge
.
Поскольку я определил связь между двумя таблицами в JPA, доступ к объекту edge для получения идентификаторов двух узлов вызывает два оператора SQL на каждый край, когда поставщик JPA lazily * загружает связанные узлы. Поскольку у меня уже есть объекты node, и идентификаторы уже загружены из таблицы краев, я хочу пропустить эти запросы, поскольку они занимают очень много времени для больших графиков.
Я попытался добавить эти строки в класс Edge
, но затем мой поставщик JPA хочет, чтобы я сделал одно сопоставление только для чтения, и я не могу найти способ, как это сделать:
@Column(name = "ixNodeTo")
private long _ixNodeTo;
@Column(name = "ixNodeFrom")
private long _ixNodeFrom;
Я использую Eclipselink и MySQL, если это имеет значение.
** Поведение по умолчанию для @ManyToOne
на самом деле является активной загрузкой, см. ответ Pascal *