2015-02-22 2 views
0

Мне нужно сохранить сложную древовидную структуру объекта, используя JPA.JPA: сохранить карту, включая исходное значение «ключ»

Существует класс «верхнего уровня», на котором я могу выполнить CASCADE.ALL, но у меня есть проблема с под-объектом класса B и поля HashMap.

«Ключ» Карты - это хэш-код самого объекта, который хранится как «значение».

Когда я каскад сохраняю объект B, однако столбец «ключ» в базе данных всегда «null» (почему?), Хотя у объекта есть несколько пар ключей.

Я пробовал некоторые вещи, такие как @MapKey, но когда я позже загружаю объект из базы данных, значение ключа больше не является хэш-кодом, а автоматически генерируемым id (что не полезно для меня).

Я также попробовал @ElementCollection для карты, но затем я получаю ошибку синхронизации (я думаю, это связано с тем, что я запускаю все это только из класса верхнего уровня и некоторой точки objectd).

@Entity 
public class B 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private long id; 

    @OneToMany(cascade = CascadeType.ALL) 
    //Tried @MapKey or @ElementCollection 
    public Map<Integer, OtherEntity> otherEntities; 

Спасибо за любую помощь, Alex

ответ

0
@MapKey(name="hashField") 

Хэш значение должно быть сохранено явно в OtherEntity.hashField. Ключ mapkey используется для определения того, какое из других свойств объекта используется как значение ключа

+0

Так что это означает, что моим другим объектамEntity требуется новое поле переменной, в котором хранится их hascode? Извините, если это вопрос сбрасывания. Я новичок .. –

+0

Да. Поэтому вы должны помнить, чтобы обновлять его, когда вы изменяете значения полей объекта сущности. Я не знаю, почему вы выбрали ключи для hascodes (если вы не используете хэш-коды DB, но тогда java не будет знать о них). Чтобы убедиться, что hashValue всегда обновляется, вы можете вызвать метод пересчета перед каждым обновлением/сохранением JPA. Http://en.wikibooks.org/wiki/Java_Persistence/Advanced_Topics#Events – Zielu

Смежные вопросы