2016-08-20 132 views
0

一些領域我有兩個實體與多對一(一對多)的關係。JPA實體之間的關係。如何使實體從DB只從關係表

類ParserEntity:

import javax.persistence.*; 

@Entity 
@Table(name = "parser", schema = "newsmonitoringdb") 
public class ParserEntity { 
    public ParserEntity() { 
    } 

    public ParserEntity(String name, SourceTypesEntity type) { 
     this.name = name; 
     this.type = type; 
    } 

    @Id 
    @Column(name = "id") 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    private Long id; 
    @Basic 
    @Column(name = "name") 
    private String name; 

    @ManyToOne(optional = false) 
    @JoinColumn(name="type",referencedColumnName="id") 
    private SourceTypesEntity type; 

    ...//getters, setters and other fields are here 
    } 
} 

類ParserTypesEntity:

import javax.persistence.*; 
import java.util.Collection; 
import java.util.List; 

/** 
* Created by User on 17.08.2016. 
*/ 
@Entity 
@Table(name = "source_types", schema = "newsmonitoringdb") 
public class ParserTypesEntity { 
    @Id 
    @Column(name = "id") 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    private Long id; 
    @Basic 
    @Column(name = "name") 
    private String name; 

    @OneToMany(mappedBy="type", fetch=FetchType.EAGER, targetEntity = ParserEntity.class) 
    private Collection<ParserEntity> siteParser; 

    ...//getters and setters are here 
    } 
} 

他們必須通過現場的關係,一切似乎確定。 但是我想要一個ParserTypeEntity類來保存ParserEntity類中的名字,而不是ParserEntity列表。

我希望它們在從數據庫檢索類型時自動填充,就像現在使用ParserEntity對象一樣。

有沒有辦法做到這一點,或者我必須將關係改爲單向函數,獲取所有類型,然後通過其id獲取每種類型的名稱?

+0

它節省了您的模型(如所有JPA文檔所述)。修正你的模型,讓你有一個字符串集合,並填充它。 –

+0

我試圖創建沒有「mappedBy」和「targerEntity」參數的OneToMany字段。我做了一個集合保存字符串參數,但是編譯器告訴OneToMany屬性值類型不應該是「String」 – Andrey

+0

顯然'@ OneToMany'不應該用於...這是關係。你想要存儲需要'@ ElementCollection'的字符串集合!建議您閱讀JPA教程,其中解釋了這些概念 –

回答

0

他們有一個領域的關係,一切似乎沒問題。然而,我會 像一個ParserTypeEntity類,以保存ParserEntity 類中的名稱在一個單獨的集合字段而不是ParserEntity列表中。

我希望在從DB獲取類型 時自動填充它們,就像現在使用ParserEntity對象一樣。

我不認爲你可以使用轉換器與集合的關係。
此外,即使你可以,我也不會使用它,因爲它可能會使代碼更自然,更不可讀。對於一個枚舉,它是有用的和整體的外觀,但對於實體收集,它看起來像一個黑客,因爲它打破了實體之間的ORM關係。

如果您使用JPA/EntityManager,我可以提出一個解決方法:使用實體的生命週期事件。否則,如果您使用Hibernate/SessionFactory,則應該查看Hibernate的偵聽器。這是一樣的原則。

這個想法是保持你的實際映射,並添加一個你想要的數據的瞬態列表,當ParserTypesEntity加載時,這些數據將以自動方式填充。

因此,在ParserTypesEntity中,您可以添加一個掛鉤方法來在實體加載時執行處理。在這種方法中,您可以收集parserEntity收藏的名稱並將其添加到transient List<String>

public class ParserTypesEntity { 
... 
    @Transient 
    private List<String> parserTypeNames; 

    @PostLoad 
    public void postLoad() { 
    parserTypeNames = new ArrayList<>(); 
    for (ParserEntity parserEntity : siteParser){ 
     parserTypeNames.add(parserEntity.getName()); 
    } 
    ... 
} 
+0

我正在使用JPA/EntityManager並且您的解決方案看起來很有趣,但它仍然需要從DB中下載所有的parserEntities,我試圖避免這種方式(我已經改變了抓取到LAZY類型而不是EAGER)。我要求這樣的事情,因爲此時應用程序只需要DB中所有實體的名稱。它需要一些對象,稍後從數據庫中獲取,但是在90%的使用率中不需要所有的對象。 – Andrey