Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Как вы сопоставляете карту в спящем режиме с помощью аннотаций?

Автор вопроса: Omar KoohejiОтветов: 3

Используя аннотации, как вы сопоставляете поле в сущности, которая является "картой" (хэш-таблицей) строки, с заданным объектом? Объект аннотирован, и его экземпляры уже хранятся в базе данных гибернации.

Я нашел синтаксис для определения карты с помощью простого ключа и значения как такового:

<class name="Foo" table="foo">
    ...
    <map role="ages">
         <key column="id"/>
         <index column="name" type="string"/>
         <element column="age" type="string"/>
     </map>
 </class>

И как ни странно, с сущностью в качестве ключа и простым типом в качестве значения:

<class name="Foo" table="foo">
    ...
  <map role="ages">
    <key column="id"/>
    <index-many-to-many column="person_id"
         class="Person"/>
    <element column="age" type="string"/>
  </map>
</class>
<class name="Person" table="person">
    ...
    <property name="name" column="name"
         type="string"/>
</class>

Но я не понимаю, как это сделать для простого сопоставления ключа с элементом, и я не понимаю, как это сделать с помощью аннотаций.

  • Это правильно объяснено здесь /3393649/ jalogar 24.01.2012

javahibernatemappingorm

Ответы

Ответ 1 · рейтинг 40 · Pascal Thivent

Вы можете просто использовать аннотацию JPA @MapKey (обратите внимание, что аннотация JPA отличается от аннотации Hibernate, Hibernate @MapKey сопоставляет столбец базы данных, содержащий ключ карты, а аннотация JPA сопоставляет свойство, которое будет использоваться в качестве ключа карты. ).

@javax.persistence.OneToMany(cascade = CascadeType.ALL)
@javax.persistence.MapKey(name = "name")
private Map<String, Person> nameToPerson = new HashMap<String, Person>();

Ответ 2 · рейтинг 2 · Juan

Я знаю, что этот вопрос очень старый, но, возможно, это может кому-то помочь.

Другая возможность примерно такая:

@Entity
@Table(name = "PREFERENCE", uniqueConstraints = { @UniqueConstraint(columnNames = { "ID_DOMAIN", "ID_USER", "KEY" })})
public class Preferences {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "ID", unique = true, nullable = false)
    private Long id;

    @Column(name = "ID_DOMAIN", unique = false, nullable = false")
    private Long domainId;

    @Column (name = "PREFERENCE_KEY")
    @Enumerated(EnumType.STRING)
    private PreferenceKey key;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "ID_USER", referencedColumnName = "ID")
    private User user;
}

and

@Entity
@Table(name = "USER", uniqueConstraints = { @UniqueConstraint(columnNames = { "ID_DOMAIN", "LOGIN" })})
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "ID", unique = true, nullable = false)
    private Long id;

    @Column(name = "ID_DOMAIN", unique = false, nullable = false")
    private Long domainId;

    // more fields

    @ElementCollection(fetch = FetchType.LAZY)
    @JoinColumns({@JoinColumn(name = "ID_USER", referencedColumnName = "ID"), @JoinColumn(name = "ID_DOMAIN", referencedColumnName = "ID_DOMAIN")})
    @OneToMany(targetEntity = Preferences.class, fetch = FetchType.LAZY)
    @MapKey(name = "key")
    private Map<PreferenceKey, Preferences> preferencesMap;
}

Это создает только две таблицы User и Preferences, обратите внимание, что PreferenceKey уникален для пользователя в домене.

Ответ 3 · рейтинг 1 · Jeff Walker

Вероятно, вам следует использовать UserType или UserCollectionType. Или вы можете использовать собственный tupleizer.

см. основную документацию по спящему режиму для ознакомления с концепциями и документация по аннотациям гибернации для эквивалентного подхода к аннотациям.

Дайте мне знать, если это не то, о чем вы просите.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы