2012-06-13 7 views
1

Я пытаюсь заставить 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

+1

Мне кажется, что у вас есть OneToMany и ManyToOne. Я ожидал, что OneToMany (mappedBy = "") будет в коллекции. Кроме того, у ManyToOne нет сопоставленного свойства по той же причине. –

+0

Да, моя вина, аннотация была помещена неправильно, не исправлена ​​в вопросе. – Wudong

+0

Где граница транзакции? То, с чем вы столкнулись, обычно вызвано неправильным объявлением границы транзакции, так что, как только запрос будет выполнен, транзакция (и, следовательно, базовый сеанс) будет закрыта сразу же, оставив сеанс для ленивой выборки –

ответ

0

Прежде всего, отображение тегов нужно поменять местами, т.е.

class User(){ 
@OneToMany(mappedBy="user") 
private List<Card> cards; 
} 

class Card{ 
@ManyToOne 
private User user; 
} 

и как вы называете ваш SomeMethod? если он вызывается в init-методе, вы не сможете использовать @Transactional

+0

- это всего лишь некоторый метод обслуживания, который обычно вызванный клиентом. не должно быть в init-методе. – Wudong