JPA:将@MapKey 用于抽象 class
JPA: Using @MapKey for an abstract class
我有以下结构
一个抽象的 superclass A
和一个 class 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 的 class 值。
所以基本上我不能像上面写的那样在 class Z 中使用 @MapKey 注释来使用 map_field。 class A.
的 map_field 没有有用的值
有人能告诉我如何解决这个问题吗?
提前致谢,亚历克斯
我没有看到你的问题。你的 class A 是抽象的,所以从来没有它的实例,所以他们不需要任何 "useful values",即使你可以有无用的 A 默认值,例如 0 或 -1取决于你的情况。
您不能在 B、C 中隐藏 superclass 的字段,因为它会弄乱所有内容。从 B、C 中删除它们及其所有工作(而且 id 是多余的,因为它已经在 A 中定义)。
但是你应该为 A 添加你的继承策略,而不是留给它机会(默认)。
我有以下结构 一个抽象的 superclass A 和一个 class 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 的 class 值。
所以基本上我不能像上面写的那样在 class Z 中使用 @MapKey 注释来使用 map_field。 class A.
的 map_field 没有有用的值有人能告诉我如何解决这个问题吗?
提前致谢,亚历克斯
我没有看到你的问题。你的 class A 是抽象的,所以从来没有它的实例,所以他们不需要任何 "useful values",即使你可以有无用的 A 默认值,例如 0 或 -1取决于你的情况。 您不能在 B、C 中隐藏 superclass 的字段,因为它会弄乱所有内容。从 B、C 中删除它们及其所有工作(而且 id 是多余的,因为它已经在 A 中定义)。 但是你应该为 A 添加你的继承策略,而不是留给它机会(默认)。