разработать класс, который может содержать различные типы (примитив, список, карта) в одном поле

Я хотел бы иметь класс Java (MyClass), который содержит идентификатор, имя и значение, где значение может быть примитивным типом (строка, int, long) или списком или картой. Класс будет сохранен с использованием JPA 2.0.

Моя первая мысль была о классе со следующей структурой:

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

которые разрешаются геттером и сеттером, если сохранен примитив, список или карта - в зависимости от комбинации {индекс, ключ, значение}.

Альтернативой может быть иерархия наследования:

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

Имея в виду, что я использую JPA: есть ли «стандартный способ» или «лучшая практика» для этой проблемы? Каким-то образом я могу использовать myClass и получить доступ к значению с помощью геттера и решить с помощью instanceof Map/List/Integer, какое значение сохраняется?


person titan_cb    schedule 16.05.2012    source источник


Ответы (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

person titan_cb    schedule 27.08.2012