2013-06-05 49 views
1

我使用JPA 2.0與Hibernate 4.1.0,我有我的Entity級以下JPA實體下拉列

@Entity 
@Table(name = "PRODUCTS") 
public class Product { 

private String productNo; 
private String productDesc; 
private Date deliveryDate; 
private Date invoiceDate; 
private Integer productCurrencyId; 
private String productCurrency; 

以上將被應用用於顯示的記錄以及爲CRUD操作。

從上面的productCurrencyIdproductCurrency將在應用程序中使用下拉貨幣的選擇字段

我想知道它是否是最好有一個單獨的實體類這兩個或相同的使用Product class?我之所以問這個問題,是因爲它是否相同Product類如何查詢我的貨幣下拉列的值?

我知道我可以在產品類@NamedQuery(nameDAOImpl中使用@NamedQueries來檢索下拉記錄。如果我想使用@NamedQuery(name那麼我有硬編碼一個SQL語句的權利?如果我沒有爲下拉值使用單獨的實體類,有什麼方法可以使用@NamedQuery(name或其他一些機制來獲取貨幣下拉的記錄?這種情況的最佳方法是什麼?

任何幫助是非常可觀的。

感謝

編輯1

我想問一下關於實體類的另一個問題是,如果我有一些其他領域的下拉列,我應該創建一個單獨的實體類所有這些下降領域?

回答

2

您想在哪裏存儲貨幣列表?Carsten解釋說,他們可以在數據庫(因此是自己的實體)中擁有自己的表格,並且您將在產品和貨幣之間擁有@OneToOne關係:

@Entity 
public class Product 
{ 
    ... 
    private String productNo; 
    private String productDesc; 
    private Date deliveryDate; 
    private Date invoiceDate; 

    @OneToOne 
    @JoinColumn(name="currencyId") 
    private Currency currency; 
    ... 
} 

@Entity 
public class Currency 
{ 
    @Id 
    private int id; 

    private String currency; 
} 

然後填充你只需要檢索從貨幣表中的所有記錄的下拉列表:

TypedQuery<Currency> query = entityManager.createQuery("SELECT c FROM Currency c"); 
List<Currency> query.getResultList(); 

這是方便,因爲添加的貨幣,你只需要一個記錄添加到貨幣表和下拉瓦特生病顯示正確的價值。

如果您的目錄是不太可能在數據庫中更改,而不是一個表,你可以使用一個枚舉:

@Entity 
public class Person 
{ 
    ... 
    public enum Gender {male, female}; 

    @Enumerated(EnumType.STRING) 
    private Gender gender; 
} 

並填充下拉列表:

Person.Gender.values(); 

所以基本上這取決於是否目錄很可能會發生變化,您希望如何處理這些變化。

+0

感謝您的回覆。我想問一個問題,是不是需要在'Product'實體中聲明'currencyId'?或'@JoinColumn(name =「currencyId」) 私人貨幣幣種;'夠了嗎?謝謝 – user75ponic

+0

還有一點是'貨幣''實體'應該是'currencyId'而不是'id'?那是我們映射'onetoone'的權利嗎? – user75ponic

+1

OneToOne註釋會自動引用被引用實體的@Id列,因此不需要在Product實體中將currencyId聲明爲int字段。在這種情況下,JoinColumn用於指定Product表中的聯合ID列的名稱,但根據默認命名約定(類似currency_ID),可以省略JoinColumn。 Currency實體中的Id列可以採用任何名稱,因爲OneToOne默認情況下會使用Id註釋的字段,無論其名稱如何。 – German

1

除了技術實現之外,我將爲貨幣制作自己的實體,因爲它是它自己的業務對象。對貨幣的更改不需要應用於每個產品。但是,將個人偏好置於實體之外的個人偏好我不能給出任何真正的潛在技術問題。 :(