Question

J'ai un peu de mal à le mappage d'un tableau d'octets à une base de données MySQL en mode veille prolongée et je me demandais si je suis absent quelque chose d'évident.Ma classe ressemble à peu près comme ceci:

public class Foo {
    private byte[] bar;

    // Getter and setter for 'bar'
}

La table est définie comme ceci dans MySQL 5.5:

CREATE TABLE foo (
bar BINARY(64) NOT NULL)

Et mise en veille prolongée 3.6.2 cartographie ressemble à ceci:

<hibernate-mapping>
    <class name="example.Foo" table="foo">
        <property name="bar" column="bar" type="binary" />
    </class>
</hibernate-mapping>

Je suis à l'aide de hbm2ddl pour la validation seulement et il me donne ce message d'erreur quand je le déploiement de l'application:

Wrong column type in foo for column bar. Found: binary, expected: tinyblob

Si vous utilisez type="binaire" dans la cartographie ne serait pas causer d'Hibernation pour attendre la colonne de type binaire (au lieu de tinyblob,) je ne sais pas ce qui serait.J'ai passé un certain temps sur Google mais impossible de trouver l'erreur exacte.Les solutions pour les erreurs similaires ont été à...

  1. Spécifiez "longueur" sur le <property>.Qui change de ce type Hibernate attend mais c'est toujours une certaine variété de blob au lieu de "binaire" type c'est de trouver.
  2. Au lieu de déclarer un "type" sur l'élément de propriété, nest un élément de colonne et de lui donner un sql-type de l'attribut.Que de travail mais qui permettrait également de faire la liaison spécifique à MySQL, donc je voudrais l'éviter si possible.

Est ce que quelque chose se démarquer sur cette configuration qui serait la cause de cette incompatibilité?Si je spécifie type="binaire" au lieu de "blob", pourquoi est-Hibernate attend à un blob au lieu d'un fichier binaire?

Était-ce utile?

La solution

Je crois que le problème est type="binary".

Ce type est une mise en veille prolongée, de type générique.Il ne traite pas directement de la carte DB-moteur de types spécifiques.Ils sont convertis en différents types SQL basé sur le pilote que vous utilisez.Apparemment, le pilote MySQL pour les cartes de la veille prolongée de type "binaire" pour un tinyblob.

La liste complète des types de hibernate est disponible ici.

Vous avez 2 options.Vous pouvez modifier votre script de création de TABLE pour stocker cette colonne avec un tinyblob type de données.Ensuite, votre hibernate validation ne serait pas échouer et votre demande de travail.Ce serait la solution proposée.

La deuxième option ne devrait être utilisée que si vous AVEZ à utiliser les BINAIRES de type de données dans la DB.Ce que vous pouvez faire est de spécifier un sql-type dans le hibernate mapping de sorte que vous appliquer à hibernate d'utiliser le type que vous souhaitez.La cartographie devrait ressembler à ceci:

<property name="bar">
  <column name="bar" sql-type="binary" />
</property>

Le principal inconvénient de ceci est que vous perdez DB -moteur de l'indépendance, qui est pourquoi la plupart des gens utiliser hibernate en premier lieu.Ce code ne fonctionne que sur les moteurs de base de données qui ont le type de données BINAIRES.

Autres conseils

Qu'est-ce que nous avons fini par faire pour résoudre un problème similaire à celui-ci est d'écrire notre propre USERType personnalisé.

USERTYPES est relativement facile à mettre en œuvre.Il suffit de créer une classe qui implémente org.hibernate.userType.userype et implémente les méthodes @override.

Dans vos définitions hibernates, l'utilisation d'un type d'utilisateur est assez simple:

<property name="data" type="com.yourpackage.hibernate.CustomBinaryStreamUserType" column="binary_data" />

Mettez simplement, ce que cela va faire est d'exécuter cette classe pour lire et écrire les données de la base de données.Plus précisément, les méthodes nullsafeget et NullSafeset sont utilisées.

Dans notre cas, nous avons utilisé cela sur GZIP Compressez des données binaires avant de l'écrire dans la base de données et de décompresser comme sa lecture.Cela cache le fait que les données sont compressées de l'application à l'aide de ces données.

Je pense qu'il existe une solution facile pour la cartographie des colonnes binaires dans Hibernate.

Les colonnes "binaires" peuvent être facilement mappées sur "Java.Util.UUID" dans les classes d'entité hibernate.

pour par ex.La définition de la colonne ressemblera à

`tokenValue` BINARY(16) NOT NULL

Hibernate Entiticey aura ci-dessous pour supporter la colonne binaire

private UUID tokenValue;

@Column(columnDefinition = "BINARY(16)", length = 16)
public UUID getTokenValue() {
    return this.tokenValue;
}

public void setTokenValue(UUID sessionTokenValue) {
    this.tokenValue = tokenValue;
}

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top