2012-06-13 137 views
1

我想讓Spring JPA Data爲我工作,但一直在掙扎。這是問題。Spring JPA Data的倉庫

我有兩個領域類與它們之間的一個簡單的一對多關係:

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異常。

我不太確定我是否錯過了那裏的東西?似乎只要存儲庫的方法返回,實體管理器就關閉了;如果是這樣的話,我想知道如何在沒有定義另一個存儲庫方法的情況下獲得關係?

但是,如果我將@ OneToMany的抓取設置爲渴望,沒有問題,但這是我真正不想做的事情。

存儲庫的delete()似乎也有問題。如果我先刪除一張卡片,然後嘗試刪除()其擁有的用戶(其列表中仍有該卡片),則刪除將失敗,抱怨無法找到該卡片。但我沒有設置從用戶到卡的任何刪除傳播!

我希望有人可以解釋如何在JpaRepository中使用entitymanager,它似乎使Jpa編程更難。我知道所有的存儲庫都是自動生成的,但是如果有人能指出它們的實現方式會非常有用。

謝謝。 武

+1

它在我看來像你有你的OneToMany和ManyToOne錯誤的方式。我期望OneToMany(mappedBy =「」)在集合上。此外,出於這個確切原因,ManyToOne沒有按屬性進行映射。 –

+0

是的,我的錯,詮釋是錯誤的方式,沒有糾正的問題。 – Wudong

+0

交易邊界在哪裏?你面臨的問題通常是由於沒有正確地聲明事務邊界而導致的,所以一旦查詢完成,事務(因此底層的Session)就會立即關閉,不會留下任何會話來進行延遲獲取 –

回答

0

首先,映射標籤需要進行互換,即

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

class Card{ 
@ManyToOne 
private User user; 
} 

,以及如何你打你的的someMethod?如果它在init方法中調用,您將無法使用@Transactional

+0

這只是一些正常的服務方法由客戶調用。不應該在init方法中。 – Wudong