【问题标题】:Changing target table for Hibernate mapping更改 Hibernate 映射的目标表
【发布时间】:2009-09-21 21:17:52
【问题描述】:

是否可以更改 Hibernate 映射的目标表?我的用例是,当我从一个表中获取数据时,如果无法处理数据,则将其存储在错误表中以供以后分析。

虽然可以在休眠映射中定义实体名称,但在我看来这是不合适的,因为它需要重复映射。然后将存在相同的映射来获取数据和错误表的不同实体名称的副本。

您对如何处理和解决这个问题有任何想法吗?

【问题讨论】:

  • 您使用的是休眠 XML 映射,而不是注释?

标签: java hibernate persistence


【解决方案1】:

简短的回答 - 不。定义一个单独的映射(通过实体名称)是可行的方法。

长答案 - 在构建 SessionFactory 之前通过运行时操作配置是可能的。您可以从配置中定义的映射中获取相关实体的映射,将其复制到新实体名称下,并将其与新名称下的基础表的副本相关联。实际上,您仍会定义一个单独的映射,但这样做很困难。

看看this question

【讨论】:

  • 我添加了一个指向另一个(有点相似)问题的链接,其中包含一些细节。除了那里描述的内容之外,您还需要复制您的课程(从 Mappings.getClass() 获得)并在通过 PersistentClass.setEntityName() 更改实体名称后通过 Mappings.addClass() 将其添加回来
  • 非常感谢,我试试这个方法。难道你不认为当你得到类(getClass())时,你修改了一个内部实例,所以这种方法不会产生另一个类,而只是改变它的实体名称?然后需要一个 clone()。
  • 这就是我说“制作副本”的原因 :-) 它也必须是深层副本,clone() 不起作用(PersistentClass 无论如何都不能克隆)。
  • 顺便说一句,如果这是您唯一需要做的事情(例如,使用不同的实体名称复制映射;没有其他操作),请考虑 skaffman 的建议。应用 XSLT 肯定比 Hibernate API 操作更容易。
  • 在你对另一个问题的回答中,你提到你做了这种配置操作。您能否提供您的代码,在哪里复制 PersistentClass 和表?
【解决方案2】:

正如@ChssPly76 所提到的,您可以跳过 Hibernate 的 API 箍来获取原始配置,摆弄它们,然后为自己构建一个新的 SessionFactory

另一个同样令人不快的解决方案是使用 XSLT 获取您的映射配置文件并将表名换成其他名称,然后将该修改后的文件提供给 hibernate 以构建新的SessionFactory

这很令人讨厌,但这确实意味着您可以避免陷入 Hibernate 的深渊。

【讨论】:

  • 当然,您知道如何以编程方式执行此操作吗?
  • 您需要熟悉 javax.xml.transform 以及 XSLT 本身。
  • 我的意思是使用 Hibernate API
  • +1。现在有了跳出框框的想法 :-) 尽管我可能会在构建期间(或在应用程序初始化期间但在初始化 SessionFactory 之前)运行它,但这肯定会更容易。
【解决方案3】:

如前所述,

如果无法处理数据,则将其存储在错误表中以供以后分析

除了 ChssPly76 的回答之外,您还可以定义一个全局 HibernateException 处理程序(如果您使用 Spring 来包装休眠连接,您应该使用 DataAccessException)并在您的数据库或其他设备(例如您可以在其中看到它的网页)中记录错误详细信息任何地方。

问候,

【讨论】:

    【解决方案4】:

    你可以使用超类吗?如果数据具有所有相同的映射信息,但属于不同的表,那么您可以将映射放在两个实体的公共父类上。使用映射的超类来定义公共属性,然后将每个具体类定义为不同的实体,继承属性。在 hibernate 注释中,这是使用父级上的 @MappedSuperclass 注释来完成的。

    【讨论】:

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