如何仅检索关联的 ID 而不是实体?

jør*_* s. 5 java annotations jpa derby eclipselink

我有一个看起来像这样的课程:

@Entity
public class EdgeInnovation {
    @Id
    public long id;
    @ManyToOne
    public NodeInnovation destination;
    @ManyToOne
    public NodeInnovation origin;
}
Run Code Online (Sandbox Code Playgroud)

另一个看起来像这样:

@Entity
public class NodeInnovation {
    @Id
    public long id;
    @OneToOne
    public EdgeInnovation replacedEdge;
}
Run Code Online (Sandbox Code Playgroud)

因此每个表都映射到另一个表,因此一个实体将引用其他实体,这些实体将引用更多实体,依此类推,最终将从数据库中获取许多实体。有没有办法只获取键的值(整数/长)而不是它所指的实体?像这样:

@ManyToOne(referToThisTable="NodeInnovation")
@Entity
public class EdgeInnovation {
    @Id
    public long id;
    @ManyToOne(referToTable="NodeInnovation")
    public Long destination;
    @ManyToOne(referToTable="NodeInnovation")
    public Long origin;
}
Run Code Online (Sandbox Code Playgroud)

和

@Entity
public class NodeInnovation {
    @Id
    public long id;
    @OneToOne(referToTable="EdgeInnovation")
    public Long replacedEdge;
}
Run Code Online (Sandbox Code Playgroud)

这是一个例子。

这是一个例子。我想要绿色的东西,我得到所有红色的东西。这浪费了从磁盘读取的内存和时间。

Chr*_*ris 6

您只需将外键映射为基本映射而不是关系:

@Entity
public class EdgeInnovation {
    @Id
    public long id;
    @Column(name="DESTINATION_ID")
    public Long destination;
    @Column(name="ORIGIN_ID")
    public Long origin;
}
Run Code Online (Sandbox Code Playgroud)

或者,您可以同时访问 EdgeInnovation 中的 ID 和引用实体,但您需要决定要使用哪个来设置映射:

@Entity
public class EdgeInnovation {
    @Id
    public long id;
    @Column(name="DESTINATION_ID", updatable=false, insertable=false)
    public Long destination_id;
    @ManyToOne
    public NodeInnovation destination;
    @Column(name="ORIGIN_ID", updatable=false, insertable=false)
    public Long origin_id;
    @ManyToOne
    public NodeInnovation origin;
}
Run Code Online (Sandbox Code Playgroud)

在上面的例子中, origin_id 是只读的,而 origin 引用用于设置表中的外键。但是,应该对这两个字段进行任何更改,以保持对象映射彼此同步。

另一种选择是使用提供者的本机代码来查找引用是否是惰性的且未被触发,然后获取外键值。如果它已被触发,您可以使用引用来获取 ID 值,因为它不会导致查询获取任何内容。不过,这是您必须查看 EclipseLink 的源代码的内容。