JPA:将@MapKey用于抽象类

时间:2015-02-22 22:41:17

标签: java hibernate jpa eclipselink jpa-2.0

我有以下结构 一个抽象的超类A. 和一个Z类,使用地图引用As子类B和C:

@Entity
Abstract Class A
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;
    Integer map_field; <----------------------- Problematic
    ....

@Entity
Class B extends A
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;
    Integer map_field;
    ....

@Entity
Class C extends A
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;
    Integer map_field;
    ....

@Entity
Class Z
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;
    @OneToMany(cascade = CascadeType.ALL)
    @MapKey(name="map_field")
    private Map<Integer,A> a_entities;

问题是map_field是基于对象B和C的值而不是A的类值。

所以基本上我不能在Z类中使用@MapKey注释来使用map_field,如上所述。我对A类的map_field没有有用的值。

有没有人提示如何解决这个问题?

先谢谢,Alex

1 个答案:

答案 0 :(得分:0)

我没有看到你的问题。你的A类是抽象的,所以从来没有它的实例,因此它们不需要任何“有用的值”,即使你有无用的默认值A,例如0或-1,这取决于你的情况。 你不能在B,C中隐藏你的超类的字段,因为它会搞乱一切。从B,C中删除它们并且它都可以工作(id也是多余的,因为它已在A中定义)。 但是你应该为A添加你的继承策略,而不是让它有机会(默认)。