【问题标题】:Hibernate persisting an Object member休眠持久化对象成员
【发布时间】:2013-05-08 14:07:15
【问题描述】:

有没有办法持久化 java.lang.Object 类型的 Entity 成员?

假设我有一个拥有成员的实体 DynamicProperty

private String name;
private Object value;

值可以是几种类型,基本上是非复杂的(字符串、布尔值、整数、十进制、枚举...)

有什么办法吗?以及 DB(Oracle) 列类型应该是什么。

【问题讨论】:

    标签: java hibernate jpa persistence


    【解决方案1】:

    我找到了一个解决方案...因为我的对象可以定义为几种有限的类型,基本类型我将对象标记为可序列化的 DB 列作为 BLOB 并且它起作用了。

    @Type(type = "serializable")
    private Object value;
    

    有没有人知道这方面的表现?或任何其他可能发生的问题..

    【讨论】:

    • 性能会比简单地将值转换为字符串更差。但主要问题是除了 Java 代码之外,您将无法对数据执行任何操作。即使使用您最喜欢的数据库客户端查看数据也无济于事,因为它将以 Java 专有二进制格式存储,而不是存储为可读字符串。我会使用一列来保存对象的类型(Double、Boolean 等),并使用一列来存储对象的字符串表示形式。
    【解决方案2】:

    如果它们是基本类型,您始终可以尝试将它们存储为字符串,然后将它们转换为您的 getter 中的正确类。

    还有另一种选择 - 您可以创建一个类,该类将保存值类型并具有必要类型的字段,但仅设置一个。类似的东西

    class Foo
    {
        Integer a;
        Double b;
        String c;
        int type;
    
        //getters and setters
    
        public Object getObject()
        {
            if (type == 1)
                return a;
            else if (type == 2)
                return b;
            return c;
        }
    }
    

    这是一种解决方法,但应该可以。我认为不可能将 Object 持久化为抽象对象。

    另外,看看@Embedded 注释,它可能会有所帮助。

    【讨论】:

    • 我不明白你的第一个建议,如果我将它们存储为 VARCHAR,你的意思是 java 属性应该输入为 String 吗?当您不知道类型时,铸造将如何工作?
    • 如果我们谈论的是整数和双精度数,这很简单 - 只需使用 Integer.parseInt() 并在预期的情况下使用 Double.parseDouble()。如果您想使用其他类型,您可以将字符串的第一个字节存储为类型字节,例如int 7 将是 I7double 3.14 - D3.14String foo - Sfoo 等。您还可以有另一个字段来保存对象的类型,就像在我的代码示例中一样,并基于您的投射就可以了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多