2011-08-05 2 views
1

를 반환JPA는 EclipseLink @OneToMany 내가 내장 된 ID를 사용하고 빈 세트

@Embeddable 
public class EntityId { 
    private long id; 
} 

을 그리고있는 다음 표 :

final EntityManager em = injector.getInstance(EntityManager.class); 
    em.getTransaction().begin(); 
    Master master = new Master(EntityId.next()); 
    SlaveLeft slaveLeft = new SlaveLeft(EntityId.next()); 
    SlaveRight slaveRight = new SlaveRight(EntityId.next()); 
    Config config = new Config(EntityId.next(), master, slaveLeft, slaveRight); 

    em.persist(master); 
    em.persist(slaveLeft); 
    em.persist(slaveRight); 
    em.persist(config); 
    em.getTransaction().commit(); 

    final Master master1 = em.find(Master.class, master.getId()); 
    System.out.println(master1.getConfigs()); 
: 다음 데이터베이스를 채우는

@Entity 
public class Master { 
    @EmbeddedId private EntityId id; 

    @OneToMany(mappedBy = "master") 
    Set<Config> configs; 
} 

@Entity 
public class SlaveLeft { 
    private @EmbeddedId EntityId id; 
} 

@Entity 
public class SlaveRight { 
    private @EmbeddedId EntityId id; 
} 

@Entity 
public class Config { 

    @EmbeddedId private EntityId id; 

    @ManyToOne 
    @JoinColumn(name = "MASTER_ID", referencedColumnName = "id") 
    private Master master; 
    @ManyToOne 
    @JoinColumn(name = "LEFT_ID", referencedColumnName = "id") 
    private SlaveLeft slaveLeft; 
    @ManyToOne 
    @JoinColumn(name = "RIGHT_ID", referencedColumnName = "id") 
    private SlaveRight slaveRight; 
} 

문제는 master1.getConfigs()가 빈을 반환한다는 것입니다.

나는 무슨 문제가 있습니까?

+0

마스터의 구성 필드는 어떻게 생겼습니까? Toplink/Eclipselink와 같은 일부 JPA 구현은 본질적으로 계산 된 필드의 값을 캐시하므로 config 클래스를 생성 할뿐만 아니라 Master의 "configs"set/list 필드에도 추가해야합니다. – SplinterReality

답변

3

다른 엔티티 maneger를 사용하여 마스터를 찾으면 configs 컬렉션이 채워질 수 있습니다. 하지만 여기서 엔티티 관리자는 캐시에서 마스터를 반환합니다. 구성의 마스터 집합에 구성을 저장하지 않았으므로 마스터 구성 집합에 없습니다.

양방향 관계를 사용하는 경우 은 관계의 양쪽 관계를 유지 관리해야합니다. ORM은 소유 측면 (mappedBy 속성이없는 것) 만 사용하여 관계가 존재하는지 여부를 결정하지만 오브젝트 그래프의 일관성은 사용자의 책임입니다.

+0

예. 더 테스트하기 캐시 된 버전이 반환되고 있음을 알았습니다. – Staale