Я никогда не использую Object как значение карты, вы можете использовать String с этим отображением:
@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 String:
@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;
}
}
Вам необходимо создать реализацию SettingValue для каждого типа, который вы хотите поддерживать, таким образом вы получите таблицу для каждого типа со столбцом для хранения вашего значения.