Ich habe Hibernate-Entitäten, die ungefähr so aussehen (Getter und Setter ausgelassen):
@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 children;
}
@MappedSuperclass
public class SuperEntity {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private long itemId;
}
Wenn ich nach EntityA abfrage, wird es ordnungsgemäß geladen, wobei die Elternbeziehung durch einen Hibernate-Proxie ersetzt wird (da sie Lazy ist). Wenn ich auf die Id des Elternteils zugreifen möchte, führe ich den folgenden Aufruf durch:
EntityA entityA = queryForEntityA();
long parentId = entityA.getParent().getItemId();
Meines Wissens nach sollte dieser Aufruf KEINEN Datenbankabfrage verursachen, da die Id in der EntityA-Tabelle gespeichert ist und der Proxie nur diesen Wert zurückgeben sollte. In meinem Fall generiert dies jedoch eine SQL-Anweisung, die EntityB abruft und erst dann die Id zurückgibt.
Wie kann ich das Problem untersuchen? Was sind einige wahrscheinliche Ursachen für dieses inkorrekte Verhalten?