Hibernate mapping Map
От: MerZoD  
Дата: 27.06.11 10:53
Оценка:
Есть 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 этой аннотации нет.
Re: Hibernate mapping Map
От: Donz Россия http://donz-ru.livejournal.com
Дата: 28.06.11 07:19
Оценка:
Здравствуйте, MerZoD, Вы писали:

MZD>Есть 3 таблицы: customer(id, name), settings(id, name, value) связаны между собой через customer_settings(customer_id, setting_id)

MZD>Есть 2 класса: Customer, Setting мапяься к одноименным таблицам.
MZD>Хочу чтобы кастомер имел мапу настоек (Customer.getSettings().get("setting1").getValue();), но чего-то не могу смапить. Если Set — идет на ура:

У тебя связь many-to-many, а ты ее объявляешь как one-to-many.
Сейчас еще раз просмотрел Reference Documentation по хибернейту, в ней map упоминается только в связях типа one-to-many. Но если делать по аналогии, должна помочь аннотация что-то вроде @MapKeyColumn(name="propertyName")
Посмотри раздел "7.2.2.2. Maps"
Re[2]: Hibernate mapping Map
От: merzod  
Дата: 16.08.11 08:02
Оценка:
Спустя время вернулся к этой же проблеме. Сделал иначе
Все свел к 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);
...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.