【问题标题】:Best way to share Java implementation between concrete JPA classes?在具体 JPA 类之间共享 Java 实现的最佳方式?
【发布时间】:2011-03-11 13:39:48
【问题描述】:

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

如果可以的话,我会将所有不同的字段和集合放在这个抽象超类上,因此也将实现方法放在那里——全部放在一个地方而不是 10 个。但是,由于 JPA 限制I cannot add JPA annotations to generic fields or accessors.

虽然我通常倾向于委托实现继承,但由于另一个 JPA 限制规定您不能拥有带有集合的嵌入式实体,因此使用委托的想法也行不通。

当我只有 3-4 个这些实体和 2-3 个方法时,这没什么大不了的,但现在我有大约 10 个 - 每个大约 7-8 个方法......以及一些方法变得非常复杂。而且我使用的“剪切复制粘贴”继承真的很烂。

还有其他绝妙的想法吗?

【问题讨论】:

    标签: java jpa entity generics abstract


    【解决方案1】:
    1. 仔细检查这些“限制”是否真的适用于您的 JPA 提供程序。我已经嵌入了带有集合的对象,并且很好(使用 Hibernate)。我有一个带有映射字段的@MappedSuperclass

    2. 您可以尝试省略@MappedSuperclass,并让超类abstract@Entity 具有适当的继承层次结构。

    【讨论】:

    • 1 - 你有一个超类,它的映射字段使用了通用类型参数,如“private List myfield”,其中“T”是抽象类的参数?
    • 2 - 我试过了......但你的想法让我想知道我是否让超类既不是实体,也不是映射的超类,也不是嵌入会发生什么。如果 JPA 忽略它,我可能会在我的具体子类上使用属性注释而不是字段注释,这些子类只调用 super.method() 并重用实现。
    【解决方案2】:

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

    但是,对于属性访问模式,我只是创建了我的通用抽象实现,而不将其注释为实体、映射超类、可嵌入或任何东西。这样 JPA 就会忽略它。然后,在具体的子类中,我根据需要创建受保护的 getter 和 setter 方法,并将 JPA 注释放在这些方法上。

    结果看起来很简单。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-24
      • 2021-03-05
      • 2013-10-07
      • 2017-06-27
      相关资源
      最近更新 更多