Question

J'utilise EJB3 et JPA (basé sur Hibernate et Oracle 10g pour le moment)

J'ai une entité qui contient un clob

@Entity
@Table(name = "My_TAB")
public class ExampleEntity implements java.io.Serializable {

    private Clob someText;

    public void setSomeText(Clob someText) {
        this.someText= someText;
    }

    @Column(name = "COLUMN_NAME")
    public Clob getSomeText() {
        return this.someText;
    }

Alors je veux sauver une entité de ce type.

En ce moment je suis en train de faire ce qui suit qui fonctionne parfaitement

ExampleEntity exampleEntity = new ExampleEntity();
exampleEntity.setSomeText(Hibernate.createClob(aStringValue));
someOtherDao.save(exampleEntity);

Cependant ce lie mon code hiberner! J'ai spécifiquement évité jusqu'à présent des extensions Hibernate et utilisées uniquement annotations JPA. Le code fonctionne parce qu'en effet Hibernate est mon implémentation actuelle.

Y at-il une sorte de API JPA qui me permet de créer un clob de façon générique? Donc, si plus tard, je décide de passer à Toplink / EclipseLink ou autre chose, je ne vais pas devoir changer une chose?

Était-ce utile?

La solution

Il y a un tel exemple est spec l'Assemblée parlementaire paritaire (§ 9.1.5)

@Column(name="DESC", 
columnDefinition="CLOB NOT NULL", 
table="EMP_DETAIL") 
@Lob 
public String getDescription() { return description; }

Je crois que c'est la façon standard pour CLOB.

Autres conseils

Je ne suis pas sûr que je le referais, mais dans le passé quand je avais besoin de limiter mon application au sous-ensemble le plus largement utilisé des types sql, je mis en œuvre des objets binaires à l'aide d'une table séparée de l'omble chevalier et la stocker et gzippés base 64 codé. En utilisant la cartographie XML, il était quelque chose comme:

<list name="encodedValue" lazy="true" table="TABLE" cascade="all-delete-orphan">
  <key column="TABLE_ID"/>
  <index column="SEQ"/>
  <element type="string" column="LINE" length="2000"/>
</list>

Dans le code, la méthode getValue récupéré les résultats de getEncodedValue, les concaténer tous ensemble puis décodé et les décompressé. À titre d'optimisation, je mets une simple colonne de valeur sur la table parent et utilisé que si elle pouvait tenir dans les 2000 caractères et seulement allé à la table des enfants si nécessaire.

La méthode setValue gzip et codé et stocké dans la colonne simple si elle convient, sinon il divisé dans les dossiers des enfants. Cela vous emmène aussi le chargement paresseux et si les données dans une colonne unique unique, il n'a même pas de faire une requête distincte.

Probablement surpuissant si vous savez que vos bases de données soutiendront CLOBs, mais a plutôt bien dans notre situation.

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