我试图对一些报告进行光学化,并试图消除加载一些昂贵的相关记录的需要(在每个~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实体,并加载所有相关的记录,即使我只需要/需要id,这是我的Bar表中的外键。
是否有任何方法可以在不加载Foo记录的情况下从Bar获取Foo.Id?提前谢谢。
发布于 2022-04-11 15:36:51
尝试将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来避免联接。因为它是只读的,所以FK值仍然是从foo引用中设置的--如果您设置引用而不是fooId UUID,那么缓存可能会出现一些问题;您可以自己设置它,或者强制刷新来让JPA为您设置。
发布于 2022-04-11 15:57:50
Hibernate认为getFooId()
是一种可以使用Bar
任何字段的方法。Hibernate无法检查该方法确切地使用了哪些字段,因此它会加载所有延迟关联,以防万一。
您可以使用@Transient
来避免这种情况
@Transient
public UUID getFooId(){
return foo.getId();
}
https://stackoverflow.com/questions/71828995
复制相似问题