Я пытаюсь заставить Spring JPA Data работать для меня, но борется. Вот проблема.Spring JPA Data's Repository
У меня есть два класса домена с помощью простого OneToMany соотношения между ними:
class Card {
@ManyToOne(mappedBy="user")
private User user;
}
class User {
@OneToMany
private List<Card> cards;
}
Я создал репозиторий интерфейс для каждого класса: CardRepository, UserRepository расширения JpaRepository, как хранилище вводится в службу
@Service
@Transactional(readOnly = true)
class Service {
@Autowired
CardRepository repo1;
@Autowired
UserRepository repo2;
public void someMethod() {
// make use of the repos
User u=repo2.findByIdentifier("ID1");
List<Card> cards = u.getCards();
//do something with the cards will throw lazyinitialization exception.
}
}
симпатичный основной установка выше. Проблема связана с someMethod(), в которой я запросил пользователя с его идентификатором, а затем попытаюсь получить список сопоставленных @ OneToMany, затем произошло исключение LazyInitialization.
Я не совсем уверен, что я что-то пропустил? кажется, что до тех пор, пока метод репозитория возвращается, entitymanager закрыт; Если это так, мне интересно, как я могу получить отношения без определения другого метода репозитория?
Если я, однако, установил приманку @ OneToMany, чтобы быть нетерпеливым, не проблема, но это то, что я действительно не хочу делать.
Удаление() репозитория кажется также проблематичным. Если я сначала удалю карточку, а затем попытаюсь удалить() ее владеющего пользователя (который все еще имеет карту в своем списке), удаление не будет жаловаться, не может найти карту. но я не установил никакого распространения распространения с Пользователя на Карту!
Я надеюсь, что кто-то может объяснить, как используется сущ. Человек в JpaRepository, похоже, что программирование Jpa становится более сложным. Я знаю, что все репозитории автоматически генерируются, но если кто-то может указать, как они реализованы, это будет очень полезно.
Спасибо. Wudong
Мне кажется, что у вас есть OneToMany и ManyToOne. Я ожидал, что OneToMany (mappedBy = "") будет в коллекции. Кроме того, у ManyToOne нет сопоставленного свойства по той же причине. –
Да, моя вина, аннотация была помещена неправильно, не исправлена в вопросе. – Wudong
Где граница транзакции? То, с чем вы столкнулись, обычно вызвано неправильным объявлением границы транзакции, так что, как только запрос будет выполнен, транзакция (и, следовательно, базовый сеанс) будет закрыта сразу же, оставив сеанс для ленивой выборки –