【问题标题】:How do I persist a Java property of type Object using Hibernate?如何使用 Hibernate 持久化 Object 类型的 Java 属性?
【发布时间】:2010-12-28 19:28:02
【问题描述】:

我有一个具有类似属性的 Java 类

private Object myObj;

当我尝试使用 Hibernate 注释保存类时,我收到相当混乱的错误消息“属性映射的列数错误”。

持久化包含此类通用属性的类的正确方法是什么?

【问题讨论】:

  • 我知道的唯一方法是序列化,我不推荐这个。每次编译应用程序时,数据库中对象的序列化版本可能会过时且无法检索。
  • 一个问题是:是什么迫使您使用Object 作为该特定字段的类型?你不能改用更具体的类型吗?
  • @afielden:您希望它如何工作?就数据库而言,您理想的最终结果是什么?
  • 我同意,这并不理想,我认为 Hibernate 可能对此有一些问题。代码不是我的,我只是使用 Hibernate 实现持久层。这个想法是 Object 属性可能包含各种各样的数据,包括但不限于图像和视频。我猜他们想要一个非常灵活的解决方案。
  • 是的,但是您希望如何在数据库中看到它?一列还是几列?是自己的表吗?这些列将是什么数据类型?在解决 ORM 难题时,您需要像关系数据库一样思考,而不是 java 开发人员。

标签: hibernate orm annotations


【解决方案1】:

如您所说,对象可以是图像、视频等。

如果它应该只有二进制数据,你可以创建另一个类,并从这个类中传输数据。在传输过程中,可以将Object转换成byte[](具体取决于具体类型),并使用Lob数据类型(@Lob)进行映射。

为了扩展这一点,如果不仅要支持二进制数据,您的新对象可以有 2 个字段 - 一个用于二进制,一个(或多个)用于其他类型。

不管怎样,现在的对象,代表了一个非常不聪明的设计,它不能不费吹灰之力地正确持久化。

【讨论】:

    【解决方案2】:

    如果可以,请不要使用通用的 Object 属性。我第一次接触 Hibernate 意味着要继承一个包含大量此类内容的项目,这是一个痛苦的世界。正如 Zoidberg 所说,使用 Object 意味着您的模型不容易序列化/版本化(老实说,这是轻描淡写)。

    【讨论】:

      【解决方案3】:

      更改属性的类型:

      private byte[] myObj;
      

      这对我来说适用于 Fluent NHibernate(尽管在 C# 中)和 varbinary(max) 的 SQL 字段类型。

      然后,您可以将其公开为图像、视频或其他任何内容。 Java中转图片的例子:

      ImageIO.read(new ByteArrayInputStream(myObj));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-03-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-18
        • 1970-01-01
        相关资源
        最近更新 更多