JPA获取外键不加载相关记录
JPA get foreign key without loading related record
我正在尝试优化一些报告,并试图消除加载一些昂贵的相关记录的需要(多个级联加载,每条约 500 条记录)。
我的实体是这样的:
@Entity
@Table(name="foo")
public class Foo
{
@Id
@Type(type = "pg-uuid")
private UUID id;
...
public UUID getId(){
return id;
}
和:
@Entity
@Table(name="bar")
public class Bar
{
@Id
@Type(type = "pg-uuid")
private UUID id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="FOO_ID")
private Foo foo;
...
public UUID getFooId(){
return foo.getId();
}
我的问题是,当我进行此调用时:return foo.getId();
hibernate 运行并实例化 Foo 实体,并加载所有相关记录,即使我只有 want/need id,这是一个外键在我的酒吧 table.
有没有办法在不加载 Foo 记录的情况下从 Bar 获取 Foo.Id?
提前致谢。
尝试将 FOO_ID 列映射为基本映射,而不是现有 Foo 引用映射或作为补充映射:
@Entity
@Table(name="bar")
public class Bar
{
@Id
@Type(type = "pg-uuid")
private UUID id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="FOO_ID")
private Foo foo;
@Column(name="FOO_ID", insertable=false, updatable=false)
private UUID fooId;
...
public UUID getFooId(){
return fooId;
}
然后您可以决定在查询中使用 fooId 以避免连接。因为它是 read-only,FK 值仍然是从 foo 引用设置的 - 如果您设置引用而不是 fooId UUID,缓存可能会出现一些问题;您可以自己设置,也可以强制刷新让 JPA 为您完成。
Hibernate 认为 getFooId()
是一种可以潜在地使用 Bar
的任何字段的方法。 Hibernate 无法检查该方法确切使用了哪些字段,因此它会加载所有惰性关联以防万一。
您可以使用 @Transient
来避免这种情况
@Transient
public UUID getFooId(){
return foo.getId();
}
我正在尝试优化一些报告,并试图消除加载一些昂贵的相关记录的需要(多个级联加载,每条约 500 条记录)。
我的实体是这样的:
@Entity
@Table(name="foo")
public class Foo
{
@Id
@Type(type = "pg-uuid")
private UUID id;
...
public UUID getId(){
return id;
}
和:
@Entity
@Table(name="bar")
public class Bar
{
@Id
@Type(type = "pg-uuid")
private UUID id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="FOO_ID")
private Foo foo;
...
public UUID getFooId(){
return foo.getId();
}
我的问题是,当我进行此调用时:return foo.getId();
hibernate 运行并实例化 Foo 实体,并加载所有相关记录,即使我只有 want/need id,这是一个外键在我的酒吧 table.
有没有办法在不加载 Foo 记录的情况下从 Bar 获取 Foo.Id? 提前致谢。
尝试将 FOO_ID 列映射为基本映射,而不是现有 Foo 引用映射或作为补充映射:
@Entity
@Table(name="bar")
public class Bar
{
@Id
@Type(type = "pg-uuid")
private UUID id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="FOO_ID")
private Foo foo;
@Column(name="FOO_ID", insertable=false, updatable=false)
private UUID fooId;
...
public UUID getFooId(){
return fooId;
}
然后您可以决定在查询中使用 fooId 以避免连接。因为它是 read-only,FK 值仍然是从 foo 引用设置的 - 如果您设置引用而不是 fooId UUID,缓存可能会出现一些问题;您可以自己设置,也可以强制刷新让 JPA 为您完成。
Hibernate 认为 getFooId()
是一种可以潜在地使用 Bar
的任何字段的方法。 Hibernate 无法检查该方法确切使用了哪些字段,因此它会加载所有惰性关联以防万一。
您可以使用 @Transient
来避免这种情况
@Transient
public UUID getFooId(){
return foo.getId();
}