【问题标题】:Why CrudRepository.save() ignore FetchType.EAGER when returning created object?为什么 CrudRepository.save() 在返回创建的对象时忽略 FetchType.EAGER?
【发布时间】:2021-01-12 16:51:15
【问题描述】:

我在我的应用程序中使用 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() 返回创建的电影时会出现问题,我希望与返回的电影列表中的用户一起工作。即使User list &lt;User&gt; 被标记为 FetchType.EAGER,也会引发 LazyInitializationException!

当我使用用户惰性引用来初始化新电影并尝试保存这部电影时,为什么 crudRepository 忽略 FetchType.EAGER?

【问题讨论】:

标签: java hibernate spring-data-jpa spring-data


【解决方案1】:

save() 只是委托给EntityManager.persistEntityManager.merge 并返回EntityManager.merge 返回的对象或您传入的对象。FetchType 在这里不起作用。如果要加载关联,可以使用refreshfindOne

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-26
    • 2013-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多