为什么 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.persistEntityManager.merge 和 returns EntityManager.merge 返回的对象或您传入的对象。 FetchType 在这里不起作用。如果要加载关联,可以使用refreshfindOne.