2

我对 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 个查询......这并不是我真正想要的。

干杯丰富

4

2 回答 2

2

我无法对此进行测试,但也许引入可嵌入对象可能会减少查询计数。像这样的东西:

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

}

只有当您特别要求时,您才能获得收藏。很抱歉答案很弱,但我仅限于我可以在这里测试的内容。

于 2010-11-26T12:03:28.253 回答
2

要强制使用父查询获取任何关系,可以在 EclipseLink 中使用 @JoinFetch 注释。

虽然,根据数据,在单独的查询中读取集合可能是最佳解决方案。

您还可以在 EclipseLink 中使用 @BatchFetch 来批量获取关系(仍然是 2 个查询,但不是 n+1 个查询)。我最近在我的博客中对批处理和加入抓取进行了比较,看,

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

于 2010-11-29T14:23:31.070 回答