97 votes

Stockage d'une Map<String,String> en utilisant JPA

Je me demande s'il est possible d'utiliser les annotations pour faire persister l'image de l'utilisateur. attributes dans la classe suivante en utilisant JPA2

public class Example {
    long id;
    // ....
    Map<String, String> attributes = new HashMap<String, String>();
    // ....
}

Comme nous avons déjà une base de données de production pré-existante, idéalement les valeurs de attributes pourrait correspondre à la table existante suivante :

create table example_attributes {
    example_id bigint,
    name varchar(100),
    value varchar(100));

191voto

Pascal Thivent Points 295221

JPA 2.0 prend en charge les collections de primitives par le biais de la fonction @ElementCollection que vous pouvez utiliser en conjonction avec la prise en charge de l'option java.util.Map des collections. Quelque chose comme ceci devrait fonctionner :

@Entity
public class Example {
    @Id long id;
    // ....
    @ElementCollection
    @MapKeyColumn(name="name")
    @Column(name="value")
    @CollectionTable(name="example_attributes", joinColumns=@JoinColumn(name="example_id"))
    Map<String, String> attributes = new HashMap<String, String>(); // maps from attribute name to value

}

Voir également (dans la spécification JPA 2.0)

  • 2.6 - Collections de classes intégrables et de types de base
  • 2.7 Collections de cartes
  • 10.1.11 - Annotation ElementCollection (collection d'éléments)
  • 11.1.29 Annotation MapKeyColumn

16voto

wciesiel Points 26
  @ElementCollection(fetch = FetchType.LAZY)
  @CollectionTable(name = "raw_events_custom", joinColumns = @JoinColumn(name =     "raw_event_id"))
  @MapKeyColumn(name = "field_key", length = 50)
  @Column(name = "field_val", length = 100)
  @BatchSize(size = 20)
  private Map<String, String> customValues = new HashMap<String, String>();

Voici un exemple de la façon de configurer une carte avec un contrôle sur les noms de colonnes et de tables et sur la longueur des champs.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X