问题描述
我的J2EE应用程序中大约有10个不同的实体,它们现在共享完全相同的实现。 它们都继承自已注释为@MappedSuperclass的同一泛型抽象类,但此类不包含我在所有具体子类中都重复过的实现。
如果可以的话,我会将所有各个字段和集合放在此抽象超类上,因此也将实现方法放在那里-全部放在一个位置而不是10个位置。但是,由于JPA限制,
尽管我通常通常偏向于委托来实现继承,但是由于另一个JPA限制,即您不能在集合中包含嵌入式实体,所以使用委托的想法也行不通。
当我只有3-4个这样的实体和2-3个方法时,这没什么大不了的,但是现在我只有大约10个-大约有7-8个方法...而且其中一些方法正在变得越来越复杂。 我正在使用的“剪切复制粘贴”继承确实很糟糕。
还有其他好主意吗?
1楼
仔细检查这些“限制”是否真正适用于您的JPA提供者。 我已经将对象嵌入到集合中,并且很好(使用Hibernate)。 我有一个带有映射字段的
@MappedSuperclass
。您可以尝试省略
@MappedSuperclass
,并使用适当的继承层次结构@MappedSuperclass
类abstract
一个@Entity
。
2楼
事实证明,只要您确保对JPA批注使用属性访问模式,就可以使用实现继承或委托。 我使用JPA注释的字段访问模式,这使我无尽痛苦,因为我无法注释通用字段类型。
但是,使用属性访问模式,我只创建了通用抽象实现,而没有将其注释为实体,mappedsuperclass,可嵌入或任何其他形式。 这样,JPA将忽略它。 然后,在具体的子类中,根据需要创建受保护的getter和setter方法,并将JPA注释放在这些方法上。
原来看似简单。