Есть 3 таблицы:
customer(id, name),
settings(id, name, value) связаны между собой через
customer_settings(customer_id, setting_id)
Есть 2 класса:
Customer,
Setting мапяься к одноименным таблицам.
Хочу чтобы кастомер имел мапу настоек (
Customer.getSettings().get("setting1").getValue();), но чего-то не могу смапить. Если Set — идет на ура:
@OneToMany(cascade = CascadeType.ALL)
@JoinTable(name = "settings_ssl", joinColumns = {@JoinColumn(name = "customer_id")}, inverseJoinColumns = {@JoinColumn(name = "setting_id")})
public Set<Stting> getSettings() {...}
Пробовал после аннотаций сета добавлять
@MapKey(name = "name"), но поведение какое-то неадекватное, сохраняет под именем первой проперти только одну последнюю.
Вродебы в поздних версиях Hibernate это делается через
@MapKeyJoinColumn, но в 3.4 этой аннотации нет.
Спустя время вернулся к этой же проблеме. Сделал иначе
Все свел к 2м таблицам:
customer(id, name),
settings(id, customer_id, name, value)
Ввел enum для удобного доступа к пропертям.
Метод getSettings() в Customer'e аннотирован следующим образом:
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, targetEntity = Settings.class) // OneToMany - map value is entity, targetEntity - map value isn't generic type
@JoinColumn(name = "customer_id") // join
@MapKey(name = "name") // map key - property of the entity
public Map<Props, Settings> getSettings() {...}
Добавил врап-методы и теперь просто и удобно работать c настройками:
String name = customer.getSetting(Props.name).getValue();
int type = customer.getSetting(Props.type).getIntValue();
customer.getSetting(Props.type).setValue(1);
...