2011-08-05 28 views
1

我使用的是嵌入式ID:JPA的EclipseLink @OneToMany返回空集

@Embeddable 
public class EntityId { 
    private long id; 
} 

而且我有以下表格:

@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; 
} 

我然後填充數據庫:

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()); 

問題是master1.getConfigs()返回空。

我缺少什麼工作關係?

+0

Master的配置字段是什麼樣的?某些JPA實現(如Toplink/Eclipselink)實際上緩存了計算字段的值,因此您不僅需要創建配置類,還需要將其添加到Master上的「配置」設置/列表字段。 – SplinterReality

回答

3

如果您使用另一個實體maneger來查找您的主,它的configs集合可能會被填充。但是在這裏,實體管理器從其緩存中返回主設備,並且由於您沒有將配置放入主配置集中,所以它不在那裏。

當使用雙向關係時,you負責維護雙方的關係。 ORM只使用擁有方(沒有mappedBy屬性的那個方)來判斷關係是否存在,但是對象圖的一致性是您的責任。

+0

是的。測試更多我發現它正在返回緩存版本。 – Staale