2012-05-16 43 views
0

我想要一個Java類(MyClass),它包含一個id,一個名稱和一個值,其中的值可以是一個基元類型(string,int,long)或列表或地圖。本課程將通過使用JPA 2.0開發一個類,可以在一個字段中容納各種類型(基元,列表,映射)

被保留我首先想到的是關於結構如下一類:

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

,通過getter和setter解決,如果IST存儲原始或列表或地圖 - 取決於{index,key,value}組合。

另一種方法是繼承層次:

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

銘記,我使用JPA:有沒有「標準方式」或「最佳實踐」爲這個問題?某種方式,我可以使用myClass並通過getter訪問該值,並使用instanceof Map/List/Integer決定保存哪種值?

回答

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中

相關問題