Подтвердить что ты не робот

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

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

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

<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>

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

4b9b3361

Ответ 1

Вы можете просто использовать аннотацию 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

@CollectionOfElements(fetch = FetchType.LAZY)
@JoinTable(name = "JOINTABLE_NAME",
    joinColumns = @JoinColumn(name = "id"))
@MapKey(columns = @Column(name = "name"))
@Column(name = "age")
private Map<String, String> ages = new HashMap<String, String>();

Ответ 3

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

см. hibernate core documentation для концепций и документация об аннуляции hibernate для эквивалентного подхода к аннотации.

Сообщите мне, если это не то, о чем вы просите.

Ответ 4

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

Другая возможность - это что-то вроде этого:

@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 уникален для пользователя в домене