我的J2EE应用程序中有大约10个不同的实体,它们现在共享完全相同的实现。它们都继承自已注释为@MappedSuperclass的相同通用抽象类,但此类不包含我在所有具体子类中重复的实现。
如果可以,我会将所有各种字段和集合放在这个抽象的超类上,因此也将实现方法放在那里 - 所有这些都在一个地方而不是10个。但是,由于JPA的限制I cannot add JPA annotations to generic fields or accessors.
虽然我通常赞成委托实现继承,但由于另一个JPA限制,即你不能拥有一个带有集合的嵌入式实体,使用委托的想法也不会起作用。
当我只有3-4个这样的实体和2-3个方法时,这不是什么大问题,但现在我有大约10个 - 每个约7-8个方法......和一些方法变得非常复杂。我使用的“剪切复制粘贴”继承非常糟糕。
还有其他精彩的创意吗?
答案 0 :(得分:1)
仔细检查这些“限制”是否真的适用于您的JPA提供商。我有嵌入对象的集合,它一直很好(使用Hibernate)。我有@MappedSuperclass
映射字段。
您可以尝试省略@MappedSuperclass
,并使用正确的继承层次结构制作超类abstract
和@Entity
。
答案 1 :(得分:0)
事实证明,只要您确定使用JPA注释的属性访问模式,就可以使用实现继承或委派。我正在使用JPA注释的字段访问模式,这使我无法忍受痛苦,因为我无法注释通用字段类型。
然而,对于属性访问模式,我只是创建我的通用抽象实现,而不将其注释为实体,mappedsuperclass,embeddable或任何东西。这样JPA就会忽略它。然后,在具体的子类中,我根据需要创建受保护的getter和setter方法,并将JPA注释放在那些上。
原来看起来很简单。