我从不使用 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 字符串实现:
@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 实现,这样您就可以为每种类型获得一个表,其中有一列来保存您的值。