У меня есть Hibernate Entities, которые выглядят примерно так (геттеры и сеттеры пропущены):
@Entity
public class EntityA {
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "parent_id")
private EntityB parent;
}
@Entity
public class EntityB extends SuperEntity {
@OneToMany(mappedBy = "parent")
@Fetch(FetchMode.SUBSELECT)
@JoinColumn(name = "parent_id")
private Set<EntityA> children;
}
@MappedSuperclass
public class SuperEntity {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private long itemId;
}
Когда я запрашиваю EntityA, он нормально загружается, а родительская ассоциация заменяется прокси-сервером Hibernate (как и Lazy). Если я хочу получить доступ к идентификатору родителя, я выполняю следующий вызов:
EntityA entityA = queryForEntityA();
long parentId = entityA.getParent().getItemId();
Как я понимаю, вызов НЕ должен совершать обход в базу данных, поскольку идентификатор хранится в таблице EntityA, и прокси-сервер должен возвращать только это значение. Однако в моем случае это создает оператор SQL, который выбирает EntityB и только затем возвращает Id.
Как я могу исследовать проблему? Каковы некоторые вероятные причины этого неправильного поведения?