【问题标题】:JPA/Hibernate: Can I have a Parent without annotations and a Child withJPA/Hibernate:我可以有一个没有注释的父级和一个有注释的子级吗
【发布时间】:2009-08-13 21:02:21
【问题描述】:

我需要创建一个可以独立使用或在更大的应用程序中使用的组件。独立使用时,它不需要数据库,也不需要任何与数据库/ORM 相关的依赖项。当用作大型应用程序的一部分时,某些类确实会通过 JPA/Hibernate 持久化到数据库中。

我认为组件中的域对象不会有任何注释(由于要求没有任何与 ORM 相关的依赖项)。在更大的应用程序中,然后我将对这些域对象进行子类化......这大约是我所做的。

通常,我使用字段级注释。是否有可能与上述情况有关?我想不是。

另一个想法是我必须切换到注释属性。在这种情况下,我会扩展未注释的域对象,覆盖所有属性,并对它们进行注释。孩子只是具有所需注释的代表。这看起来像是很多工作/代码。

具有讽刺意味的是,我认为如果我使用的是 hbm.xml,这将更容易实现,我们最近已经放弃了它。我错过了带有注释的东西吗?

【问题讨论】:

    标签: hibernate jpa annotations


    【解决方案1】:

    JPA 注释确实是您唯一的依赖项。如果有人以 POJO(非 DB)方式使用您的对象,他们所需要的只是 JPA 注释 jar,对于大多数应用程序服务器而言,它实际上位于类路径中。

    当然只是将注解作为依赖是相当合理的,它不像你需要拖入整个hibernate并且它有很多朋友。

    另一种方法是您已经制定出的方法是为该实体使用 hbm。这还不错,因为 hibernate 很乐意在单个 SessionFactory 中混合注释和 hbm 样式实体,并且您仍然可以使用字段访问,因此不需要损害您的类的公共接口。

    【讨论】:

    • 不可能使用 hbm.xml 格式,因为我们还使用 Enver 对我们的实体进行历史/审计跟踪,并且它需要注释(当前)。我正在考虑推迟并尝试获得最小依赖的津贴可能是最好的方法。我只是希望我忽略了其他一些简单/明智的解决方案。
    【解决方案2】:

    如果您对无依赖的要求很严格,那么我建议您遵循它, 甚至避免注释依赖。

    我不会子类化域对象只是为了注释它们。 我相信这麻烦多于帮助。
    对一个实体进行子类化很容易,但在引用的实体上它会变得混乱。 您必须对所有实体进行子类化,重做所有构造函数(因为它们不是继承的)等等。

    对我来说,xml 配置非常适合这种情况。 尽管有些人(我喜欢)更喜欢注释,但 xml 仍然有效。 它经过防火测试、有据可查、广为人知且随时可用。

    如果您真的不想编写 xml,您可以使用 HibernateTools 生成它,最好是从您的数据库中生成它(但其他选项也是可能的,该工具是通用的)。

    如果对注释的需求非常强烈,我会转向代码生成。 我通常会使用注释创建我的域对象。 然后我会从中生成类的非注释版本,只需删除注释。

    然后类会有所不同..这可能会影响您的其余代码。如果它们具有相同的全名(但在给定的配置中只提供了一个),您可能会针对每个版本编译您的代码......如果您需要在不重新编译的情况下使用其中任何一个,您还可以生成一个公共父接口(没有注释)...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-07
      • 2019-07-26
      • 1970-01-01
      • 2014-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多