2015-10-12 47 views
0

我有一個普通的JPA實體與生成的ID-屬性:JPA並含有

@Entity(name = "AUTO_COMPLETION") 
public class AutoCompletion extends AbstractEntity { 

    @Id 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "aip_seq") 
    @SequenceGenerator(name = "aip_seq", sequenceName = "aip_seq", allocationSize = 1) 
    @Column(name = "ID") 
    private Long id; 

... 

} 

我創建JPA實體:

AutoCompletion c2a1 = new AutoCompletion(); 
    c2a1.setClient(c2); 
    c2a1.setText("c2a1"); 
    c2a1.setType(AutoCompletionType.PERSON); 
    autoCompletionService.create(c1a1); 

創建如下實現的:

@Override 
public T create(final T t) { 
    this.em.persist(t); 
    return t; 
} 

現在,實體與ID屬性集一起被寫入數據庫。我想通過一個函數再次檢索:

List<AutoCompletion> completions = autoCompletionService.getAutoCompletions() 

我想我可以打電話給

completions.contains(c2a1) 

但它總是返回false ...我不明白爲什麼。它不應該返回真實?

+0

您是否實現了equals方法? –

+0

沒有它的默認值。但我認爲entitymanger會照顧 – matthias

+0

您使用哪個JPA提供商?你能看到哪個是方法返回的List實現? –

回答

0

我會建議實施的hashCode和equals

0

當你堅持下去,你創建的對象和檢索到的永遠不會是相同的對象。是的,它們在邏輯上是相等的,因爲它們屬於DB中的同一行,但是它們是不同的對象引用並指向內存中的不同位置。

查看javadoc的List.contains。它使用你的類的equals方法進行比較。由於您沒有重寫equals方法,因此它將默認obj1 == obj2來操作,只有當它們指向內存中的相同位置時纔會返回true。

0

只有在相同事務中完成調用時,您纔會獲得相同的實體實例。我想這不是你的情況,你打電話給服務類,你可能沒有比服務更大的事務範圍。

正如其他人已經建議,equals()hashcode()需要實施,以便List#contains()像你期望的那樣工作。這可能會或可能不會對您的其他代碼產生影響,因此應該對其進行分析。