JPA EclipseLink @OneToMany возвращает пустой набор - PullRequest
1 голос
/ 05 августа 2011

Я использую встроенный идентификатор:

@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 () возвращает пустое значение.

Чего мне не хватает, чтобы получить рабочее отношение?

1 Ответ

3 голосов
/ 05 августа 2011

Если вы используете другого менеджера сущностей, чтобы найти своего мастера, его коллекция конфигов, вероятно, будет заполнена.Но здесь менеджер сущностей возвращает мастера из его кэша, и, поскольку вы не поместили конфигурацию в набор настроек мастера, его там нет.

При использовании двунаправленных отношений вы несете ответственность за поддержание обеих сторон отношений.ORM использует только сторону-владельца (ту, у которой нет атрибута mappedBy), чтобы решить, существует ли связь, но ответственность за согласованность графа объектов лежит на вас.

...