Ho una relazione tra tre oggetti modello nel mio progetto (frammenti di modello e repository alla fine del post.
Quando chiamo PlaceRepository.findById, attiva tre query di selezione:
("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
Questo è un comportamento piuttosto insolito (per me). Per quanto ne so dopo aver letto la documentazione di Hibernate, dovrebbe sempre utilizzare le query JOIN. Non c'è differenza nelle query quando si FetchType.LAZYcambia in FetchType.EAGERnella Placeclasse (query con SELECT aggiuntivo), lo stesso per la Cityclasse quando si FetchType.LAZYcambia in FetchType.EAGER(query con JOIN).
Quando uso la CityRepository.findByIdsoppressione degli incendi, due selezioni:
SELECT * FROM city c where id = argSELECT * FROM state s where id = city.state.id
Il mio obiettivo è quello di avere un comportamento identico in tutte le situazioni (o sempre JOIN o SELECT, ma JOIN è preferibile).
Definizioni del modello:
Posto:
@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
}
Città:
@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
}
Archivi:
PlaceRepository
public interface PlaceRepository extends JpaRepository<Place, Long>, PlaceRepositoryCustom {
Place findById(int id);
}
UserRepository:
public interface UserRepository extends JpaRepository<User, Long> {
List<User> findAll();
User findById(int id);
}
CityRepository:
public interface CityRepository extends JpaRepository<City, Long>, CityRepositoryCustom {
City findById(int id);
}