2012-01-23 14 views
2

私は、エンティティユーザ任意の「列」は

public class User { 
    private String username; 
    private String password; 

    private Map<String, Object> settings = new HashMap<String, Object>(); 

    //Getters & setters 
} 

私は、クエリの設定マップのキーを使用することができますどのような方法がありますがあると? 例:

Criterion crit = mySession.createCriterion(User.class); 
crit.add(Restrictions.eq("settings.blah", 1234L)); 
List<User> results = crit.list(); 

やELを経由してマップ値にアクセスしますか? 例:

<h:dataTable value="#{myBean.users}" var="user"> 
    <h:column> 
     <h:outputText value="#{user.blah}"/> 
    </h:column> 
</h:dataTable> 

私は部分的にシンプル@OneToManyマッピングでこれを行うことができますが、それは、キーと値の両方を使用するように私のクエリを必要とし、プロパティはELを通じてアクセスすることはできません。

これは可能でしょうか?注釈を付けるにはどうすればいいですか?

おかげ

EDIT: は、私は、任意のフィールドを持つことができるように、基本的に、私が後だが「垂直テーブルの実装であり、まだマッピングされたクラスとしてエンティティを使用することができます。これが冬眠でも可能かどうかはわかりません。

答えて

0

I決してユーザーオブジェクトマップの値は、あなたがこのマッピングの文字列を使用することができますよう:あなたは、列の異なる種類を使用する必要がある場合

@Entity 
public class User { 

private int _id; 
private Map<String, String> _settings; 

public User() { 

} 

@Id 
@GeneratedValue 
public int getId() { 
    return _id; 
} 

public void setId(int id) { 
    _id = id; 
} 

@ElementCollection 
@MapKeyColumn(name = "SETTINGS_KEY") 
@CollectionTable(name = "USER_SETTINGS", joinColumns = @JoinColumn(name = "user_id")) 
@Column(name = "SETTING") 
public Map<String, String> getSettings() { 
    return _settings; 
} 

public void setSettings(Map<String, String> settings) { 
    _settings = settings; 
} 

} 

が、あなたはマップの値としてインタフェースを使用する必要があります。

@Entity 
public class TestSettings { 

    private int _id; 
    private Map<String, SettingValue<?>> _settings; 

    public TestSettings() { 

    } 

    @Id 
    @GeneratedValue 
    public int getId() { 
     return _id; 
    } 

    public void setId(int id) { 
     _id = id; 
    } 

    @OneToMany 
    @MapKeyColumn(name = "SETTINGS_KEY") 
    @CollectionTable(name = "USER_SETTINGS", joinColumns = @JoinColumn(name = "user_id")) 
    @Column(name = "SETTING") 
    public Map<String, SettingValue<?>> getSettings() { 
     return _settings; 
    } 

    public void setSettings(Map<String, SettingValue<?>> settings) { 
     _settings = settings; 
    } 

} 

SettingValue抽象クラス:

@Entity 
@Inheritance(strategy=InheritanceType.JOINED) 
public abstract class SettingValue<V> implements Serializable { 

    private static final long serialVersionUID = 3355627640146408150L; 

    private Integer _id; 

    public SettingValue() { 
     super(); 
    } 

    @Id @GeneratedValue 
    public Integer getId() { 
     return _id; 
    } 

    public void setId(Integer id) { 
     _id = id; 
    } 

    @Transient 
    public abstract V getValue(); 

    public abstract void setValue(V value); 

} 

settingValue Strinこのようなグラムの実装:あなたはあなたの価値を保持するために列を種類ごとにテーブルを取得このように、サポートしたい各タイプのSettingValueの実装を作成する必要が

@Entity 
@PrimaryKeyJoinColumn(name="settingvalue_id", referencedColumnName="id") 
public class TextSettingValue extends SettingValue<String> implements Serializable { 

    private String _value; 

    public TextSettingValue() { 
     super(); 
    } 

    @Override 
    public void setValue(String value) { 
     _value = value; 
    } 

    @Override 
    public String getValue() { 
     return _value; 
    } 

}