2013-03-22 109 views
0

我正在使用EclipseLink將數據庫(Oracle 11g)映射到JPA實體。我幾乎每個表映射到JPA的對象,但我剛剛發現了一個問題:集合沒有填充OneToMany關係 - EclipseLink

在\曲線\實體,我有以下字段:

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

的問題是,當我查詢\曲線\實體,總是在細節,都爲空儘管有兩個表中的有效數據。檢查數據庫我注意到\ CurveDetail \ table中沒有外鍵約束,所以我想知道這些約束是否需要正確映射數據庫?我沒有嘗試自己添加FK約束,因爲我不允許(必須要求DBA來完成),並且需要一週的時間。

在此先感謝!

+0

當你設置關係,你是否設置雙方? manyToOne控制關係,因此需要將變化設置爲最小,以便在數據庫中保持更改,但兩者都應由應用程序維護。 – Chris 2013-03-22 12:44:42

+0

@Chris雙方意味着什麼?我只是執行查詢,我不更新或插入數據。查詢\ SELECT o從曲線o \返回的所有曲線的\ CurveDetail \集合爲空,這就是問題 – CocheLee 2013-03-22 12:57:01

+1

嘗試刷新,看看這是否是緩存被破壞的問題,因爲如果這個EclipseLink將放入一個空集合是從數據庫中構建的。您如何以及在哪裏訪問集合?如果在實體之外,請確保使用訪問器方法。 – Chris 2013-03-23 00:03:02

回答

1

不需要擁有外鍵。

檢查由啓用日誌記錄生成的SQL(「eclipselink.logging.level」 =「最好」)

嘗試執行相同的SQL使用相同的數據庫,以查看是否存在的數據。

此外,請確保您沒有通過插入/更新具有空集合的對象來破壞共享高速緩存。您必須保持雙向關係的雙方。您可以嘗試禁用緩存以查看這是否是您正在做的事情。

+0

我禁用緩存進行測試,並解決了我的問題,現在我必須檢查邏輯,看看我在哪裏破壞它。非常感謝! – CocheLee 2013-03-26 07:17:21

0

據我所知有一個FK約束不是強制性的。一旦我遇到了同樣的問題(但是它是Oracle 9i),並發現實體類的名稱應該與要映射的表的名稱相匹配,並且JPA SQL和Hibernate HQL都區分大小寫,因此請謹慎寫作@Column標籤。