休眠:来自查询的错误结果

问题描述 投票:1回答:1

我真的对实体状态感到困惑。通常,为什么两个具有不同过滤参数的查询返回相同的结果列表。

我有一个实体“制造商”:

这具有一个@OneToMany映射:

@OneToMany(mappedBy = "manufacturer", cascade = CascadeType.ALL)
private List cars;

互补的“汽车”实体看起来像这样:

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "manufacturer_dbid", nullable = false)
private Manufacturer manufacturer;

我有一个Spring Repository,其中有一个选择查询,用于选择制造商和定义年份的合适汽车:

@Query(value = "SELECT m FROM manufacturer m JOIN m.cars c WHERE c.year = ?1")
@EntityGraph(attributePath = {"cars"})
List<Manufacturer> findByYear(int year);

在我的ManufacturerService中,存储库的此功能将被调用两次:

public void compareYears(year1, year2)
{
List<Manufacturer> modelsYear1 = findManufacturerModels(year1);
List<Manufacturer> modelsYear2 = findManufacturerModels(year2);
}

private List<Manufacturer> findManufacturerModels(int year)
{
return this.manufacturerRepo.findByYear(int year);
}

但是,这正是我的问题。第一个函数调用(findManufacturerModels(year1)返回正确的结果,但第二个函数调用(年份不同)返回的结果完全相同。

在Spring Boot日志文件中,两个查询都将正确记录。第一个查询与year1,第二个查询与year2。

也许我必须在这里使用detach(),但是我不知道这是否是解决此类问题的正确方法,或者是否有更聪明的解决方案。

java hibernate jpa entitymanager
1个回答
-1
投票

一旦实体存储在Hibernate Session中,在查询结果集中将使用相同的实体引用。

因此,对于托管实体,将跳过与托管实体关联的结果集条目,而改为使用托管实体。

查看this article,以获得有关JPA和Hibernate应用程序级可重复读取机制的更多详细信息。

© www.soinside.com 2019 - 2024. All rights reserved.