2010-05-10 2 views
3

나는 @ManyToMany 관계를 갱신하려고하지만 대신 삭제됩니다 ...JPA @ManyToMany는 한쪽에만 있습니까?

내 프로젝트의 클래스는 다음과 같습니다

@Entity 
public class Project { 
    ... 
    @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER) 
    @JoinTable(name = "PROJECT_USER", 
    joinColumns = @JoinColumn(name = "PROJECT_ID", referencedColumnName = "ID"), 
    inverseJoinColumns = @JoinColumn(name = "USER_ID", referencedColumnName = "ID")) 
    private Collection<User> users; 
    ... 
} 

하지만이 없습니다 - 내가 원하지 않는 - User 엔터티에있는 프로젝트 모음.

생성 된 데이터베이스 테이블을 보면 모양이 좋아 보입니다. 여기에는 모든 열과 제약 조건 (기본/외래 키)이 포함됩니다.

그러나 사용자 목록이있는 프로젝트를 유지할 때 (사용자는 여전히 데이터베이스에 있음) 매핑 테이블 은 업데이트되지 않습니다.은 업데이트되지만 나중에 프로젝트를 새로 고치면 사용자는 삭제됩니다. 더 나은 이해를 위해

:

그래서
Project project = ...; // new project with users that are available in the db 
System.out.println(project getUsers().size()); // prints 5 
em.persist(project); 
System.out.println(project getUsers().size()); // prints 5 
em.refresh(project); 
System.out.println(project getUsers().size()); // prints 0 

, 어떻게 사용자와 프로젝트 사이의 관계는 새로 고칠 수 있습니다?

답변

1

오류 그렇지 않으면 당신은 최대 절전 모드를 받고해야

내가 (무 조작을 지속하고) 실제로 데이터베이스에서 나온 않았다 프로젝트를 가정입니다 ... 당신이 왼쪽으로 코드 것 같다 아직 커밋되지 않은 엔티티를 새로 고치려고하면 예외가 발생합니다.

여기서는 JDBC와 ORM의 차이점과 EntityManager가 실제로하는 일에 대해 다소 혼란스러워합니다. em.persist는 SQL 삽입 또는 SQL 업데이트가 아닙니다. 그것은 '이 새로운 실재물을 가져다가 관리 된 상태에 놓습니다.'라고 말합니다. 일반적으로 SQL 인서트로 연결되지만 응용 프로그램 수준에서는 의미가 없습니다.

당신이 본질적으로 최대 절전 모드라고 말한 것처럼 보입니다. "다음에 세션을 동기화하고 다음에 세션을 동기화하십시오. 오, 내 마음이 바뀌 었습니다. 다시 데이터베이스로 되돌아갑니다. " em.persist는 데이터베이스에 직접 아무것도 넣지 않으며, 아마도 "아무것도"존재하지 않을 것입니다.

새로 고침하기 전에 em.flush를 던져보십시오. 사용자가 표시되어야합니다.

는 (당신은 당신의 세션은 트랜잭션을 관리하는 방법을 구성이나 방법에 대해 아무 말도하지 않은, 그래서 나는이 모든 것이 하나의 트랜잭션에 있으리라 믿고있어.)

+0

덕분에 ... em.flush을 () 트릭을 했어! –

+0

달성하고자하는 기능이 무엇인지 궁금합니다. 이 실험은 ORM의 작동 방식에 대한 흥미로운 학문적 인 조사이지만, 실제로 당신이 그것을하고 싶어하는 이유를 모르겠습니다. UnitTesting 용 – Affe

+0

... –