开发一个可以在一个字段中保存各种类型(基元,列表,映射)的类

时间:2012-05-16 11:04:03

标签: design-patterns jpa mapping

我想要一个包含id,名称和值的java类(MyClass),其中值可以是基本类型(字符串,整数,长整数)或列表或映射。该课程将使用JPA 2.0

保留

我的第一个想法是关于具有以下结构的类:

 ,-----------.
 | MyClass   |
 |...........|
 | id        |
 | name      |
 | index     |
 | key       |
 | value     |
 '------------

如果存储基元或列表或地图,则通过getter和setter解析 - 取决于{index,key,value}组合。

替代方案是继承层次结构:

                     .................
                     | AbstractClass |
                 ,.- ................''--..__
            _,-''            |               `--.._
         ,-'                 |            ................
......................       |            |MapValueClass |
| PrimitiveValueClass|       |            ................
......................       |
                    ..................
                    | ListValueClass |
                    ..................

请记住,我使用的是JPA:这个问题是否存在“标准方式”或“最佳实践”?某种方式,我可以使用myClass并通过getter访问该值并使用instanceof Map / List / Integer决定保持什么样的值?

1 个答案:

答案 0 :(得分:1)

我找到了一个适用于我的解决方案:基类和保存派生类的值:

基类:

package jpa.inheritance_demo;

import java.util.List;

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;

@Entity
public class Resource {

    @Id
    private long oid;

    @OneToMany
    @JoinColumn(name="OID")
    private List<Property> props;

}

标量属性类:

package jpa.inheritance_demo;

import javax.persistence.Entity;

@Entity
public class ScalarProperty extends Property {
    private String value;

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }
}

列出属性类:

package jpa.inheritance_demo;

import java.util.List;

import javax.persistence.ElementCollection;
import javax.persistence.Entity;

@Entity
public class ListProperty extends Property {

    @ElementCollection
    List<String> value;

    public List<String> getValues() {
        return value;
    }

}

...不要忘记将类添加到persistence.xml