Код: Выделить всё
application.properties
# The below has been set to false to get rid of the anti-pattern stuff it introduces
spring.jpa.open-in-view=false
...
< /code>
@Entity
public class User {
@Id
@GeneratedValue
private UUID id;
@OneToMany(mappedBy = "user", fetch = FetchType.LAZY)
private List articles;
...
}
< /code>
@Entity
public class Article {
@Id
@GeneratedValue
private UUID id;
@ManyToOne(optional = false, fetch = FetchType.LAZY)
private User user;
...
}
Код: Выделить всё
@DgsComponent
public class UserDataFetcher {
@Autowired
private UserService userService;
@DgsQuery
public User getUserById(@InputArgument UUID id) {
return userService.findById(id);
}
...
}
Код: Выделить всё
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserRepository userRepository;
@Override
public User findById(UUID id) {
return userRepository.findById(id).orElseThrow(DgsEntityNotFoundException::new);
}
...
}
Код: Выделить всё
@DgsComponent
public class UserDataFetcher {
@Autowired
private UserService userService;
@DgsQuery
public User getUserById(@InputArgument UUID id) {
return userService.findById(id);
}
@DgsData(parentType = "User", field = "articles")
public List getArticle(DgsDataFetchingEnvironment dfe) {
User user = dfe.getSource();
Hibernate.initialize(user.getArticles());
return user.getArticles();
}
...
}
< /code>
Но вышеупомянутое начало бросать исключения, сообщающие мне, что Hibernate не может найти открытый сеанс для приведенного выше запроса. Что имело смысл, потому что их не было, поэтому я поместил @transactional
Код: Выделить всё
@DgsComponent
public class UserDataFetcher {
@Autowired
private UserService userService;
@DgsQuery
public User getUserById(@InputArgument UUID id) {
return userService.findById(id);
}
@DgsData(parentType = "User", field = "articles")
@Transactional
public List getArticle(DgsDataFetchingEnvironment dfe) {
User user = dfe.getSource();
Hibernate.initialize(user.getArticles());
return user.getArticles();
}
...
}
< /code>
Тем не менее, приведенное выше не сработало. Я также попытался перенести этот @transactional
Я ищу решения, отличные от следующих: < /p>
- PrettyPrint-Override ">объекта для использования fetchmode.join .
Код: Выделить всё
@DgsData(parentType = "User", field = "articles") @Transactional public List getArticle(DgsDataFetchingEnvironment dfe) { User user = dfe.getSource(); List articles = articlesRepository.getArticlesByUserId(user.getUserId); return articles; } < /code> Я не в пользу вышеупомянутого решения, поскольку я чувствую, что это недостаточно использует сам ОРМ, пытаясь разрешить отношение самостоятельно, а не позволяя самому спячке. (Исправьте меня, если я ошибаюсь так, думая так) Изменение моего пользователя
Код: Выделить всё
@Entity
public class User {
@Id
@GeneratedValue
private UUID id;
@OneToMany(mappedBy = "user", fetch = FetchType.LAZY)
@Fetch(FetchMode.JOIN)
private List articles;
...
}
< /code>
Это то же самое, что и указывать Hibernate, чтобы с нетерпением загружать приведенную ниже коллекцию, несмотря ни на что. Я тоже этого не хочу. Не в пользу этого, так как это просто полосовая помощь для LazyInitializationExceptions
Любые другие решения, которые просто забывают о ленивом>
Подробнее здесь: https://stackoverflow.com/questions/691 ... it-was-fet