我正在使用JPA eclipselink 2.6.4开发应用程序。
我正在为服务器JPA实体启用共享缓存。
@Entity
@Cache(
type=CacheType.SOFT,
size=500
)
public class Tutor
{
@Id
@Column(name = "id")
private String id;
@Column(name = "name")
private String name;
... getters and setters
}
@Entity
@Cache(
type=CacheType.SOFT,
size=500
)
public class Student
{
@Id
@Column(name = "id")
private String id;
@Column(name = "name")
private String name;
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="TUTOR_ID")
private Tutor tutor;
... getters and setters
}
我得到了一个典型的辅导老师和学生的实体协会。之所以定义为LAZY,是因为我们希望在完成学生查询后避免出现“ N + 1问题”。
当我们执行学生查询并希望解决关联时,我们使用JOIN FETCH技术:
SELECT s FROM Student s JOIN FETCH s.tutor t WHERE s.id = :id
好的,在这里。
我们第一次执行JPA查询,因为共享缓存还没有学生,所以将执行数据库查询。我们得到的学生实体中填充了导师实体。
尽管如此,第二次我们执行相同的查询时,共享缓存中没有命中,因此不会执行数据库查询。但是,然后学生实体中就没有教师实体了。
我们想让学生实体中包含导师实体。
我们已经看到有可能将关联更改为EAGER,但是我们不想更改为EAGER以免出现“ N + 1问题”。
有什么主意吗?
谢谢