0

我想要一个包含 id、名称和值的 java 类(MyClass),其中值可以是原始类型(字符串、int、long)或列表或映射。该类将使用 JPA 2.0 持久化

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

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

如果存储了原始或列表或地图,则由 getter 和 setter 解析 - 取决于 {index, key, value} 组合。

另一种方法是继承层次结构:

                     .....................
                     | 抽象类 |
                 ,.- ......''--..__
            _,-'' | `--.._
         ,-' | ......
...................... | |地图值类 |
| 原始值类| | ......
...................... |
                    .....................
                    | 列表值类 |
                    .....................

请记住,我使用 JPA:对于这个问题是否有“标准方法”或“最佳实践”?以某种方式,我可以使用 myClass 并通过 getter 访问值并使用 instanceof Map/List/Integer 决定持有哪种值?

4

1 回答 1

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

于 2012-08-27T13:43:15.047 回答