2013-06-05 113 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

除了技术实现之外,我将为货币制作自己的实体,因为它是它自己的业务对象。对货币的更改不需要应用于每个产品。但是,将个人偏好置于实体之外的个人偏好我不能给出任何真正的潜在技术问题。 :(