2012-06-06 3 views
2

Мне нужна помощь с аннотациями спящего режима.Hibernate Аннотации Карта Java

У меня есть следующие 2 сущности:

public class Custom { 
private Map<KeyObject, ValueObject> properties; 

@oneToMany(mappedBy = "customId", cascade = CascadeType.All) 
@MapKey(name = "keyObject") 
public Map<KeyObject, ValueObject> getProperties(); 

..... 
} 

public class ValueObject { 
private KeyObject keyObject; 
private Long customId; 
private String value; 

...getters and setters 
} 

У меня есть простой класс дао для сохранения, обновления, выберите и удалять записи.

Если я удаляю запись с карты в пользовательском объекте, а затем вызываю customDao.save (custom), мои изменения никогда не сохраняются в базе данных. Он не бросает никаких ошибок.

Я видел в примерах спящего режима я могу определить customId как пользовательский объект вместо Long в таблице KeyValue, но я не хотел этого делать.

Я устанавливаю свою сущность неправильно?

ответ

4

Когда ассоциация имеет атрибут mappedBy, это означает: я не являюсь владельцем этой ассоциации. Любые изменения, сделанные с этой стороны ассоциации, не будут иметь значения для Hibernate. Важно то, что другая сторона ассоциации.

Я удивлен, что это даже работает, потому что я ожидал, что Hibernate потребует ManyToOne с другой стороны, типа Custom. Но уверен, что если вы не установите для поля custom/customId значение null в KeyValue/ValueObject, Hibernate не установит этот столбец в нуль.

+0

Спасибо за быстрый ответ. Первоначально я использовал ValueObject Dao для сохранения данных на карте. Однако я столкнулся с проблемой. После того, как я удалю запись и попытаюсь добавить запись, я получаю исключение HibernateOptimisticLockingFailureException, в котором моя партия была устаревшей. Я думаю, что это было причиной, потому что я использовал ajax для обновления записей карты, а пользовательский объект в модели никогда не обновлялся. – blong824