Простейший случай карты один-ко-многим в Hibernate не работает в MySQL - PullRequest
1 голос
/ 24 марта 2010

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

@Entity
@AccessType("field")
class Member {
    @Id
    protected long id;

    @OneToMany(cascade = CascadeType.ALL, fetch=FetchType.LAZY)
    @MapKey(name = "name")
    private Map<String, Preferences> preferences
             = new HashMap<String, Preferences>(); 
}

@Entity
@AccessType("field")
class Preferences {
    @ManyToOne Member member;
    @Column String name;
    @Column String value;
}

Похоже, что это должно работать, и это работает в HSQL. В MySQL есть две проблемы: Во-первых, он настаивает на том, чтобы существовала таблица с именем Members_Preferences, как если бы это было отношение многих ко многим.

Во-вторых, он просто не работает: так как он никогда не заполняет Members_Preferences, он никогда не получает настройки.

[Моя теория заключается в том, что, поскольку я использую только HSQL в режиме памяти, он автоматически создает Members_Preferences и никогда не должен получать карту настроек. В любом случае, либо Hibernate содержит огромную ошибку, либо я делаю что-то не так.]

1 Ответ

3 голосов
/ 24 марта 2010

И, конечно, я потею проблему часами, опубликую ее здесь и через минуту ...

В любом случае, ответ - это элемент mappedBy аннотации @OneToMany:

@OneToMany(cascade = CascadeType.ALL, fetch=FetchType.LAZY, mappedBy="member")
@MapKey(name = "name")
private Map<String, Preferences> preferences
         = new HashMap<String, Preferences>(); 

Что имеет определенный смысл: какое поле в сущности Много указывает на Единую сущность?Даже если допустить, что поиск подходящего поля @ManyToOne был слишком подвержен ошибкам, я думаю, что то, что они сделали (предполагая существование таблицы сопоставления), делает еще хуже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...