我的jpa / hibernate非常奇怪。
我有4个实体,类似这样的
entity County has Set<City>
City has Set<CityRegion>
CityRegion has Set<House>
我在DAO中有2个查询(在2种方法中)。我将QueryDsl用于JPA,但它会生成这2个jpa查询。
select distinct county
from County county
inner join fetch county.cities as city
inner join fetch city.cityRegions as cityRegion
inner join fetch cityRegion.houses as house
where city.id = ?1
select distinct county
from County county
inner join fetch county.cities as city
inner join fetch city.cityRegions as cityRegion
inner join fetch cityRegion.houses as house
where house.id = ?1
当我只从服务类调用第二个查询时,它工作正常。但是当我调用第一个查询然后调用第二个(在相同的服务方法中)时,第二个查询返回与第一个相同的结果(在这种情况下是错误的)。我无法找到被id查询的房子。那所房子也不属于那个城市。
在日志中生成的本机sql看起来很好而且正确。
我没有二级缓存。也许交易和第一级缓存存在一些问题?
UPDATE 实际上它始终返回第一个查询的结果,我更改查询的顺序,现在第二个查询再次返回与第一个查询调用相同的结果。似乎有一些缓存。就像你第一次运行查询和第二次hibernate返回相同的结果一样,这可能吗?但是我可以在日志中看到两个sql查询。
更新2 代码看起来像这样
@Service
public class CountryService {
@Autowired
private CountryRepository countryRepo;
public CountryService(CountryRepository countryRepo){
this.countryRepo = countryRepo
}
public List<Country> getByFilter(int cityId, int houseId){
List<Country> a = this.countryRepo.getByCity(cityId);
List<Country> b this.countyRepo.getByHouseId(houseId);
return merge(a, b);
}
}
@Repository
@Transactional
public class CountryRepository {
@PersistenceContext
private EntityManager entityManager;
public List<Country> getByCity(int id){}
public List<Country> getByHouse(int id){}
}
更新3
如果我做entityManager.clear();
它工作正常,
我调查并发现两个dao方法都使用相同的hibernate会话。我认为这会导致这个问题。 Myabe我需要以某种方式强制spring和hibernate为每个方法调用创建新的Session?
项目使用Spring启动,jpa / hibernate。感谢。