【发布时间】:2015-06-18 14:09:36
【问题描述】:
我的项目中的三个模型对象(模型和存储库 sn-ps 在帖子末尾)之间确实存在关系。
当我调用 PlaceRepository.findById 时,它会触发三个选择查询:
("sql")
SELECT * FROM place p where id = argSELECT * FROM user u where u.id = place.user.idSELECT * FROM city c LEFT OUTER JOIN state s on c.woj_id = s.id where c.id = place.city.id
这是相当不寻常的行为(对我来说)。据我在阅读 Hibernate 文档后所知,它应该始终使用 JOIN 查询。 Place 类中FetchType.LAZY 更改为FetchType.EAGER 时(使用附加SELECT 查询),查询没有区别,FetchType.LAZY 更改为FetchType.EAGER 时City 类相同(使用JOIN 查询)。
当我使用CityRepository.findById 抑制时会触发两个选择:
SELECT * FROM city c where id = argSELECT * FROM state s where id = city.state.id
我的目标是在所有情况下都有一个 sam 行为(总是 JOIN 或 SELECT,但首选 JOIN)。
模型定义:
地点:
@Entity
@Table(name = "place")
public class Place extends Identified {
@Fetch(FetchMode.JOIN)
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "id_user_author")
private User author;
@Fetch(FetchMode.JOIN)
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "area_city_id")
private City city;
//getters and setters
}
城市:
@Entity
@Table(name = "area_city")
public class City extends Identified {
@Fetch(FetchMode.JOIN)
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "area_woj_id")
private State state;
//getters and setters
}
存储库:
PlaceRepository
public interface PlaceRepository extends JpaRepository<Place, Long>, PlaceRepositoryCustom {
Place findById(int id);
}
用户存储库:
public interface UserRepository extends JpaRepository<User, Long> {
List<User> findAll();
User findById(int id);
}
城市存储库:
public interface CityRepository extends JpaRepository<City, Long>, CityRepositoryCustom {
City findById(int id);
}
【问题讨论】:
-
看看 5 种初始化惰性关系的方法:thoughts-on-java.org/…
标签: java spring hibernate jpa spring-data-jpa