2014-02-16 43 views
0

是否有可能拥有一个集合的地图?对于下面的代码,用户有一些购买,但我想映射它,所以产品实体(或产品ID)是关键,而这些值是所有类型产品的购买。JPA,Hibernate,使用@MapKeyColumn的集合地图

@Entity 
public class User { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long id; 

    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, targetEntity = Purchase.class, orphanRemoval = true) 
    @JoinColumn(name = "user_id", updatable = false) 
    @MapKeyColumn(name = "product_id") 
    private Map<Long, List<Purchase<Product>>> purchases = new HashMap<>(); 

} 

@Entity 
public class Product { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 

} 

@Entity 
public class Purchase<T extends Product> implements Serializable { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    Long id; 

    @ManyToOne 
    @JoinColumn(name = "user_id", referencedColumnName = "id") 
    private User user; 

    @ManyToOne(targetEntity = Prodect.class) 
    @JoinColumn(name = "product_id", referencedColumnName = "id") 
    private T product; 

    @Column(name = "purchase_date") 
    private Date purchaseDate; 

} 

异常;

org.springframework.orm.hibernate3.HibernateSystemException: could not get a field value by reflection getter of test.domain.Purchase.id; nested exception is org.hibernate.PropertyAccessException: could not get a field value by reflection getter of test.domain.Purchase.id 
... 
Caused by: org.hibernate.PropertyAccessException: could not get a field value by reflection getter of test.domain.Purchase.id 
... 
Caused by: java.lang.IllegalArgumentException: Can not set java.lang.Long field test.domain.Purchase.id to java.util.ArrayList 

回答

0

规格在JSR317v2.0只考虑

  1. 基本型
  2. 嵌入型
  3. 实体的地图收藏。

在地图的钥匙,和值部分,似乎

private Map<Long, List<Purchase<Product>>> purchases = new HashMap<>(); 

它是为规范的目的更加复杂。

请考虑为您的要求有这样的事情。

,但我想它映射这样的产品实体(或产品ID)是关键, 和值是一种产品的所有采购。

private Map<Product, Purchase> purchases 

并使用@MapKey

映射键注释用于指定其中 地图键本身是主键或 实体持久字段或属性的特殊情况是地图的价值。在指定MapKey时MapKeyClass注释是 。

注:@MapKeyColumn(NAME = “PRODUCT_ID”)只给出了列名不执行任何操作与所需的配置只是在表中给出的列名,