0

我正在使用 EclipseLink 将数据库(Oracle 11g)映射到 JPA 实体。我已经将几乎每个表都映射到 JPA 对象,但我刚刚发现了一个问题:

在 \Curve\ 实体中,我有以下字段:

@Id
@Column(name = "COD_CURVE")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq.gen")
@SequenceGenerator(name = "seq.gen.curve", sequenceName = "SEQCURVE", allocationSize = 1)
private long codCurve;

@Id
@Column(name = "FEC_HISTORIC")
@Temporal(javax.persistence.TemporalType.DATE)
private Date fecHistoric;

@OneToMany(mappedBy="codCurve", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private Collection<CurveDetail> detailsCollection;

在 \CurveDetail\ 实体中,我有这个:

@ManyToOne
@JoinColumns({
    @JoinColumn(name = "COD_CURVE", referencedColumnName = "COD_CURVE"),
    @JoinColumn(name = "FEC_HISTORIC", referencedColumnName = "FEC_HISTORIC")
})
private Curve codCurve;

问题是,当我查询 \Curve\ 实体时,尽管两个表中都有有效数据,但详细信息始终为空。检查数据库我注意到 \CurveDetail\ 表中没有外键约束,所以我想知道 ¿ 这些约束是正确映射数据库所必需的吗?我没有尝试自己添加 FK 约束,因为我不被允许(必须请 DBA 来做,这需要一周时间)。

提前致谢!

4

2 回答 2

1

不需要外键。

检查通过启用日志记录生成的 SQL ("eclipselink.logging.level"="finest")

尝试用相同的数据库执行相同的 SQL 以查看数据是否存在。

还要确保您不会通过插入/更新具有空集合的对象来破坏共享缓存。您必须保持双向关系的双方。您可以尝试禁用缓存以查看这是否是您正在执行的操作。

于 2013-03-25T14:31:40.160 回答
0

据我所知,FK 约束不是强制性的。一旦我遇到同样的问题(但它是 Oracle 9i)并发现 Entity 类的名称应该与您要映射的表的名称匹配,并且 JPA SQL 和 Hibernate HQL 都区分大小写,所以在编写时要小心@列标签。

于 2013-03-22T12:42:33.643 回答