当前位置: 代码迷 >> java >> 在具体的JPA类之间共享Java实现的最佳方法?
  详细解决方案

在具体的JPA类之间共享Java实现的最佳方法?

热度:78   发布时间:2023-07-25 19:05:10.0

我的J2EE应用程序中大约有10个不同的实体,它们现在共享完全相同的实现。 它们都继承自已注释为@MappedSuperclass的同一泛型抽象类,但此类不包含我在所有具体子类中都重复过的实现。

如果可以的话,我会将所有各个字段和集合放在此抽象超类上,因此也将实现方法放在那里-全部放在一个位置而不是10个位置。但是,由于JPA限制,

尽管我通常通常偏向于委托来实现继承,但是由于另一个JPA限制,即您不能在集合中包含嵌入式实体,所以使用委托的想法也行不通。

当我只有3-4个这样的实体和2-3个方法时,这没什么大不了的,但是现在我只有大约10个-大约有7-8个方法...而且其中一些方法正在变得越来越复杂。 我正在使用的“剪切复制粘贴”继承确实很糟糕。

还有其他好主意吗?

  1. 仔细检查这些“限制”是否真正适用于您的JPA提供者。 我已经将对象嵌入到集合中,并且很好(使用Hibernate)。 我有一个带有映射字段的@MappedSuperclass

  2. 您可以尝试省略@MappedSuperclass ,并使用适当的继承层次结构@MappedSuperclassabstract一个@Entity

事实证明,只要您确保对JPA批注使用属性访问模式,就可以使用实现继承或委托。 我使用JPA注释的字段访问模式,这使我无尽痛苦,因为我无法注释通用字段类型。

但是,使用属性访问模式,我只创建了通用抽象实现,而没有将其注释为实体,mappedsuperclass,可嵌入或任何其他形式。 这样,JPA将忽略它。 然后,在具体的子类中,根据需要创建受保护的getter和setter方法,并将JPA注释放在这些方法上。

原来看似简单。