因此默认情况下是这样的:
public class MyEntity{
private int id;
@OneToOneOrWhatever
private MyOtherEntity other;
}
您可以简单地通过将对象添加到关系中来建立关系。但就我而言,急切加载整个对象实在是太过分了。我只想检索“ MyOtherEntity”的ID,仅此而已。 是这样的:
public class MyEntity{
private int id;
@SomeFancyAnnotationToRelateTo(MyOtherEntity.class)
private int foreignKeyId;
}
可能吗?
答案 0 :(得分:0)
这可以做到。
public class MyEntity{
private int id;
@OneToOne(fetch = FetchType.LAZY)
@Fetch(FetchMode.JOIN)
@JoinColumn(name = "myTypeId")
private MyType myType;
}
答案 1 :(得分:0)
只需使用FetchType.LAZY
。
public class MyEntity{
private int id;
@ManyToOne(fetch = FetchType.LAZY)
private MyOtherEntity other;
}
然后您可以通过myEntity.getMyOtherEntity().getId();
一些解释: 如果在实体的属性上设置了延迟加载,则当Hibernate从数据库加载该实体时,与其创建适当的属性Object并从其自己的表中加载其所有属性,不如为该对象创建一个“代理”并仅在其中存储ID。
稍后当您第一次尝试访问该代理对象的任何属性时,它将识别出该对象未初始化,并且确实加载了该对象。
他们通常说,当您第一次访问该对象时,该对象将被加载。 但是“ id”字段是一个例外。它也已经存在于代理对象中! (这很合乎逻辑:为了从DB加载整个实体,无论如何都需要id)。 因此,只要您仅访问id字段,其他字段就不会加载。 (将无法访问OtherEntity的数据库表)
尽管创建了代理对象,并且在后台发生了一些其他的JPA /休眠魔术,但这仍然是访问id字段的最有效方法。 (此外,如果您以后再使用其他字段,则会自动加载它们)