0

ID、名前、および値を保持する Java クラス (MyClass) が必要です。値は、プリミティブ型 (string、int、long) またはリストまたはマップにすることができます。クラスはJPA 2.0を使用して永続化されます

私の最初の考えは、次の構造を持つクラスについてでした。

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

{index, key, value} の組み合わせに応じて、プリミティブ、リスト、またはマップが格納されている場合、ゲッターとセッターによって解決されます。

別の方法として、継承階層があります。

                     ...................
                     | | 抽象クラス |
                 ,.- ................''--..__
            _,-'' | `--.._
         ,-' | ...............
……………… | |マップ値クラス |
| | プリミティブ値クラス| | | ...............
……………… |
                    ...................
                    | | リスト値クラス |
                    ...................

私はJPAを使用していることを覚えておいてください:この問題の「標準的な方法」または「ベストプラクティス」はありますか? 何らかの方法で、myClass を使用してゲッターで値にアクセスし、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 に答える