我正在使用EclipseLink将数据库(Oracle 11g)映射到JPA实体。我几乎将每个表都映射到了JPA对象,但我刚发现了一个问题:
在\ Curve \ entity中,我有以下字段:
@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 \ entity中我有这个:
@ManyToOne
@JoinColumns({
@JoinColumn(name = "COD_CURVE", referencedColumnName = "COD_CURVE"),
@JoinColumn(name = "FEC_HISTORIC", referencedColumnName = "FEC_HISTORIC")
})
private Curve codCurve;
问题在于,当我查询\ Curve \ entity时,尽管两个表中都有有效数据,但细节始终为null。检查数据库我注意到\ CurveDetail \表中没有外键约束,所以我想知道是否需要这些约束来正确映射数据库?我没有尝试过自己添加FK约束,因为我不允许(必须要求DBA这样做,而且需要一周时间)。
提前致谢!
答案 0 :(得分:1)
不需要外键。
检查启用日志记录生成的SQL(“eclipselink.logging.level”=“finest”)
尝试使用相同的数据库执行相同的SQL,以查看数据是否存在。
还要确保通过插入/更新具有null集合的对象来破坏共享缓存。你必须保持双向关系的双方。您可以尝试禁用缓存以查看这是否正在执行此操作。
答案 1 :(得分:0)
我知道有一个FK约束不是强制性的。一旦我遇到同样的问题(但它是Oracle 9i)并发现Entity类的名称应该与您要映射的表的名称相匹配,并且JPA SQL和Hibernate HQL都是区分大小写的,所以在写作时要小心@Column标签。