JPA carte JSON colonne pour Objet Java
Nous avons une grande table avec un grand nombre de colonnes. Après, nous avons déménagé à MySQL Cluster, le tableau ne peut pas être créé en raison de:
ERREUR 1118 (42000): Ligne de taille trop grande. Le maximum de la ligne de taille pour le type de table, pas de comptage de Gouttes, 14000. Cela comprend les coûts de stockage, consultez le manuel. Vous devez changer certaines colonnes de TEXTE ou de Gouttes
Comme un exemple:
@Entity @Table (name = "appconfigs", schema = "myproject")
public class AppConfig implements Serializable
{
@Id @Column (name = "id", nullable = false)
@GeneratedValue (strategy = GenerationType.IDENTITY)
private int id;
@OneToOne @JoinColumn (name = "app_id")
private App app;
@Column(name = "param_a")
private ParamA parama;
@Column(name = "param_b")
private ParamB paramb;
}
C'est une table pour stocker les paramètres de configuration. Je pensais que l'on peut combiner certaines colonnes dans l'un et l'enregistrer comme objet JSON et de le convertir dans un objet Java.
Par exemple:
@Entity @Table (name = "appconfigs", schema = "myproject")
public class AppConfig implements Serializable
{
@Id @Column (name = "id", nullable = false)
@GeneratedValue (strategy = GenerationType.IDENTITY)
private int id;
@OneToOne @JoinColumn (name = "app_id")
private App app;
@Column(name = "params")
//How to specify that this should be mapped to JSON object?
private Params params;
}
Où nous l'avons défini:
public class Params implements Serializable
{
private ParamA parama;
private ParamB paramb;
}
En utilisant ce que nous pouvons combiner toutes les colonnes dans l'une et créer notre table. Ou nous pouvons diviser l'ensemble de la table en plusieurs tables. Personnellement, je préfère la première solution.
De toute façon, ma question est comment faire correspondre les Paramètres de la colonne qui est texte et contient chaîne JSON d'un objet Java?
ne this vous aider
nous avons considéré cela comme la solution finale. Si je ne me trompe pas, il augmente la complexité alors que l'on tente de modifier les données. Merci quand même.
Je ne suis pas sûr. Nous utilisons MySQL cluster avec NDBCluster moteur pour nos tables. Est-il toujours en vigueur?
OriginalL'auteur Rad | 2014-09-09
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser une APP convertisseur de carte de votre Entité dans la base de données.
Juste ajouter une annotation semblable à celui-ci à votre params champ:
et puis créer la classe d'une manière similaire (cette fonction convertit un Objet générique, vous pouvez spécialiser):
Ça y est: vous pouvez utiliser cette classe pour sérialiser un objet json dans le tableau.
Si le json stockées dans la base de données est un tableau, ce qui signifie quelque chose comme: [{...},{...},{...}], sera le convertisseur de lever une exception ou le mappeur de le manipuler?
Excellent, il a travaillé avec hibernate ymanager core/entitymanager de 4.3.6 version de lui-même.
Aussi la classe du convertisseur doivent être annotées avec
@Converter
À droite, j'ai édité le post, merci.
OriginalL'auteur Alessandro Polverini
Comme je l'ai expliqué dans cet article, la JPA
AttributeConverter
est trop limitée à la carte JSON types d'objet, surtout si vous souhaitez les enregistrer sous forme de JSON binaire.Maintenant, pour expliquer comment tout cela fonctionne.
J'ai écrit un article sur la façon dont vous pouvez mapper des objets JSON sur les deux PostgreSQL et MySQL.
Pour PostgreSQL, vous devez envoyer l'objet JSON dans une forme binaire:
La
JsonBinarySqlTypeDescriptor
ressemble à ceci:et la
JsonTypeDescriptor
comme ceci:Maintenant, vous devez déclarer le nouveau type sur le niveau de la classe ou dans un package-info.java au niveau du package descriptior:
Et l'entité de cartographie ressemblera à ceci:
Si vous êtes en utilisant Hibernate 5 ou version ultérieure, puis le
JSON
type est enregistré automatiquement par Postgre92Dialect.Sinon, vous devez vous inscrire vous-même:
OriginalL'auteur Vlad Mihalcea
J'ai eu un problème similaire, et résolu par l'utilisation de @Externalizer d'annotation et de Jackson pour sérialiser/désérialiser des données (@Externalizer est OpenJPA spécifiques d'annotation, de sorte que vous devez vérifier avec votre implémentation JPA possibilité similaire).
Params implémentation de la classe:
HTH
Non, nous sommes en utilisant JPA basé sur OpenJPA, et cette annotation est OpenJPA spécifiques. Je pense que Hibernate comme JPA fournisseur ne fournit pas cette fonctionnalité, uniquement si vous utilisez comme simple mise en veille prolongée (HQL) et pas JPA. Et Spring Data JPA, comme son nom l'indique, utilise JPA...
OriginalL'auteur Magic Wand