为什么 CrudRepository.save() 在返回创建的对象时忽略 FetchType.EAGER?
Why CrudRepository.save() ignore FetchType.EAGER when returning created object?
我在我的应用程序中使用 Spring Data Jpa。应用程序中有两个实体。实体 Film
:
//annotations omitted
public class Film {
// other annotations omitted
@ManyToMany(fetch = FetchType.EAGER)
private List<User> users;
...
和User
:
//annotations omitted
public class User {
// other annotations omitted
@ManyToMany(fetch = FetchType.LAZY)
private List<Film> films;
...
和 Film
的 DTO:
public class FilmTo implements Serializable {
private List<Integer> userIds; // i using users ids instead of users for simplify REST-requests
}
并且应用程序有存储库 类:
@Transactional(readOnly = true)
public interface CrudFilmRepository extends JpaRepository<Film, Integer> {
}
@Transactional(readOnly = true)
public interface CrudUserRepository extends JpaRepository<User, Integer> {
}
好的。当我想保存新电影时使用此代码:
@Service
public class FilmService {
@Autowired
private CrudFilmRepository repository;
@Autowired
private CrudUserRepository userRepository;
public Film save(FilmTo filmTo) {
Film film = new Film();
film.setUsers(Arrays.stream(filmTo.getUserIds())
.map(crudUserRepository::getOne)
.collect(Collectors.toList()));
return repository.save(film);
}
问题发生在save() returns 创建Film 时,我想在返回的Film 中与List 中的用户一起工作。即使 User list <User>
被标记为 FetchType.EAGER!
也会抛出 LazyInitializationException
当我使用用户惰性引用来初始化新电影并尝试保存这部电影时,为什么 crudRepository 忽略 FetchType.EAGER?
save()
只是委托给 EntityManager.persist
或 EntityManager.merge
和 returns EntityManager.merge
返回的对象或您传入的对象。 FetchType
在这里不起作用。如果要加载关联,可以使用refresh
或findOne
.
我在我的应用程序中使用 Spring Data Jpa。应用程序中有两个实体。实体 Film
:
//annotations omitted
public class Film {
// other annotations omitted
@ManyToMany(fetch = FetchType.EAGER)
private List<User> users;
...
和User
:
//annotations omitted
public class User {
// other annotations omitted
@ManyToMany(fetch = FetchType.LAZY)
private List<Film> films;
...
和 Film
的 DTO:
public class FilmTo implements Serializable {
private List<Integer> userIds; // i using users ids instead of users for simplify REST-requests
}
并且应用程序有存储库 类:
@Transactional(readOnly = true)
public interface CrudFilmRepository extends JpaRepository<Film, Integer> {
}
@Transactional(readOnly = true)
public interface CrudUserRepository extends JpaRepository<User, Integer> {
}
好的。当我想保存新电影时使用此代码:
@Service
public class FilmService {
@Autowired
private CrudFilmRepository repository;
@Autowired
private CrudUserRepository userRepository;
public Film save(FilmTo filmTo) {
Film film = new Film();
film.setUsers(Arrays.stream(filmTo.getUserIds())
.map(crudUserRepository::getOne)
.collect(Collectors.toList()));
return repository.save(film);
}
问题发生在save() returns 创建Film 时,我想在返回的Film 中与List 中的用户一起工作。即使 User list <User>
被标记为 FetchType.EAGER!
当我使用用户惰性引用来初始化新电影并尝试保存这部电影时,为什么 crudRepository 忽略 FetchType.EAGER?
save()
只是委托给 EntityManager.persist
或 EntityManager.merge
和 returns EntityManager.merge
返回的对象或您传入的对象。 FetchType
在这里不起作用。如果要加载关联,可以使用refresh
或findOne
.