스프링 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
OneToMany 및 ManyToOne이 잘못되어있는 것처럼 보입니다. OneToMany (mappedBy = "")가 컬렉션에 있어야합니다. 또한 ManyToOne에는 정확한 이유가있는 속성별로 매핑되지 않습니다. –
예, 내 잘못입니다. 주석은 문제가 해결되지 않은 잘못된 방향으로 놓여 있습니다. – Wudong
여기서 트랜잭션 경계는 무엇입니까? 직면 한 일은 일반적으로 트랜잭션 경계를 올바르게 선언하지 않아서 쿼리가 완료되면 트랜잭션 (및 기본 Session)이 즉시 닫히고 지연 페칭에 대한 세션이 남아 있지 않기 때문에 발생합니다. –