我的项目中遇到Hibernate问题。 Session.get()方法返回null,尽管具有所需id的对象确实存在于数据库中。
Long geocodedLocationId = geocoderService.geocode(latitude, longitude);
GeocodedLocation geocodedLocation = (geocodedLocationId != null) ? geocodedLocationService.read(geocodedLocationId) : null;
第一行是使用RMI调用GeocoderService,GeocoderService对纬度/经度进行地理编码,并创建一个保存在表格中的GeocodedLocation对象" geocoded_locations"。
在此之后,如果GeocoderService返回了一个ID,我们将从数据库加载该对象并使用它。
问题是GeocoderService返回ID,但Hibernate无法通过数据库中的id找到对象。
但是当我再次以相同的纬度和经度运行程序时,它返回相同的ID,并且Hibernate能够在数据库中找到该对象。因此,最近创建的GeocodedLocations失败了。
我尝试在第一行之后立即停止调试器。所以我可以检查返回的ID,并在mysql中检查它,所以我看到所需的对象确实存在。但是当我尝试通过ID加载它时,Hibernate无法做到(所以我认为问题不在于GeocoderService没有刷新会话,因为我可以看到GeocodedLocation已经已保存到数据库中。
其他信息: read()方法实现:
@Override
public T read(PK id) {
T returnValue = (T) factory.getCurrentSession().get(type, id);
return returnValue;
}
"类型"是GeocodedLocation.class," id"是一个很长的价值。
尝试按id获取对象时正在执行的查询如下:
Hibernate:
/* load com.my.domain.businessObjects.GeocodedLocation */ select
geocodedlo0_.id as id30_0_,
geocodedlo0_.building_number_name as building2_30_0_,
geocodedlo0_.street as street30_0_,
geocodedlo0_.town_city as town4_30_0_,
geocodedlo0_.region as region30_0_,
geocodedlo0_.postcode as postcode30_0_,
geocodedlo0_.state as state30_0_,
geocodedlo0_.country as country30_0_
from
db_production.geocoded_locations geocodedlo0_
where
geocodedlo0_.id=?