Как определить аннотацию EclipseLink для следующего? - PullRequest
2 голосов
/ 26 ноября 2010

Я относительно новичок в мире EclipseLink, я перечитывал документацию, однако у меня возникла реальная проблема при попытке представить следующую таблицу.

PTY_NO  |   REF_OBG
6544        45663
6544        1234
6544        97543
6544        1123
6544        77897

В идеале я хотел бы представить вышеуказанные данные следующим образом.

@Entity
@Table(name="FCS_ISSR_OBG")
public class fcs_issr_obg implements Serializable  {

    @Id
    @Column(name="PTY_NO")
    private long pty_no;

    @Column(name="REF_OBG")
    private List<long> ref_obg;

...

Как только я получу данные в этой форме, я планирую сериализовать класс в кэш-память Coherence.

Однако аннотация, которую я использовал, на самом деле не компилируется ...

Любая помощь будет принята с благодарностью.

.. обновление

Лучшее, что мне удалось придумать, это

@Entity
@Table(name="FCS_ISSR_OBG")
public class fcs_issr_obg implements Serializable, PortableObject {

    private static final long serialVersionUID = 1L;

    @Id
    @Column(name="PTY_NO")
    private long pty_no;

    @ElementCollection(targetClass = Long.class, fetch = EAGER)
    @CollectionTable(
            name = "FCS_ISSR_OBG",
            joinColumns=@JoinColumn(name="PTY_NO")
            )
    @Column(name ="REF_OBG")
    private List<Long> collection;

Однако это приводит к двум запросам ... что на самом деле не то, что я хочу.

Приветствие Рич

Ответы [ 2 ]

2 голосов
/ 29 ноября 2010

Для принудительной выборки любых отношений с родительским запросом в EclipseLink может использоваться аннотация @JoinFetch.

Хотя чтение коллекции в отдельном запросе может быть лучшим решением в зависимости от данных.

Вы также можете использовать @BatchFetch в EclipseLink для пакетной выборки отношений (по-прежнему 2 запроса, но не n + 1 запросов). Недавно я провел сравнение в пакетном режиме и загрузке в моем блоге, см.

http://java -persistence-performance.blogspot.com /

2 голосов
/ 26 ноября 2010

Я не смог проверить это, но, возможно, введение встраиваемого объекта может уменьшить количество запросов. Примерно так:

@Entity
@Table(name = "FCS_ISSR_OBG")
public class FCS_ISSR_OBGDto implements Serializable {

  @Column(name = "PTY_NO", nullable = false)
  private Long pty_no;

  private List<REF_OBGDto> REF_OBGs = new ArrayList<REF_OBGDto>();

  @ElementCollection
  @CollectionTable(name = "FCS_ISSR_OBG", joinColumns = @JoinColumn(name = "PTY_NO"))
  @Column(name = "REF_OBG")
  public List<REF_OBGDto> getREF_OBGs() {
    return REF_OBGs;
  }
}

с встраиваемым элементом, похожим на это

@Embeddable
@Table(name = "FCS_ISSR_OBG")
public class REF_OBGDto {

  @Column(name = "REF_OBG")
  public Long ref_obg;

}

Вы получаете коллекцию только тогда, когда специально ее просите. Извините за слабый ответ, но я ограничен тем, что я могу проверить здесь.

...