2012-06-13 6 views
1

스프링 JPA 데이터가 나를 위해 노력하고 있지만 노력하고 있습니다. 여기에 문제가있다.스프링 JPA 데이터의 저장소

I 그들 간의 간단한 OneToMany 관계로 두 개의 도메인 클래스가있다 : I 클래스마다 저장소 인터페이스를 설정

class Card { 
    @ManyToOne(mappedBy="user") 
    private User user; 
} 

class User { 
    @OneToMany 
    private List<Card> cards; 
} 

: CardRepository 상기 JpaRepository 연장 UserRepository 두 저장소는 서비스에 주입

@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()와 함께 문제가 발생합니다. someMethod()에서 식별자를 가진 User를 쿼리 한 다음 매핑 된 @ OneToMany의 목록을 가져 오려고 시도한 다음 LazyInitialization 예외가 발생했습니다.

내가 뭔가를 놓친 것이 확실하지 않습니까? 저장소의 메소드가 반환되면 entityManager는 닫힌다. 그렇다면 다른 저장소 방법을 정의하지 않고 어떻게 관계를 얻을 수 있을지 궁금합니다.

그러나 @ OneToMany의 가져 오기를 열망하도록 설정하면 문제는 없지만 실제로는 원하지 않는 내용입니다.

저장소의 delete()도 문제가있는 것처럼 보입니다. 먼저 카드를 삭제 한 다음 소유하고있는 사용자 (여전히 목록에 카드가 있음)를 삭제하려고하면 카드를 찾을 수 없다는 불만이 사라지게됩니다. 하지만 나는 사용자로부터 카드로 어떤 전파 전파도 설정하지 않았다!

누군가 JpaRepository에서 entitymanager를 사용하는 방법을 설명 할 수 있기를 바랍니다. Jpa 프로그래밍을 더 어렵게 만드는 것처럼 보입니다. 나는 모든 저장소가 자동으로 생성된다는 것을 알고 있지만 누군가가 어떻게 구현되는지를 지적 할 수 있다면 매우 유용 할 것이다.

감사합니다. 모든 Wudong

+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-method에서 호출하면 을 사용할 수 없습니다. @ Transactional

+0

정상적으로 처리되는 일부 서비스 메소드입니다. 클라이언트가 호출합니다. init 메소드에 있어서는 안된다. – Wudong

관련 문제