Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    hibernate hbm e property transient

    Ciao a tutti,
    sono nuovo del mondo java.

    Sto realizzando un progetto con Hibernate e sto realizzando la mappatura delle classi in XML nel file Hibernate.hbm.xml

    Devo definire una delle property della mia entità come transient, ossia non voglio che per quella property venga fatta persistenza sul Database.

    Esiste una annotazione @transient se si realizza la mappatura della classe da codice, ma non riesco a capire come ottenere lo stesso risultato con l'XML.

    Vi copio parte del mio XML, sperando che possa aiutarvi a capire il mio problema.

    codice:
    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0 //EN"
                                       "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    
    <hibernate-mapping>
    <class name="Pippo.web.entities.Contatti" table="VW_CONTATTI">
    <id column="IDCONTATTO" name="Idcontatto" type="int">
    <generator class="sequence">
    <param name="sequence">SEQ_IDCONTATTO</param>
    </generator>
    </id>
    <property column="CAP" generated="never" lazy="false" name="Cap" type="string"/>
     <property column="COGNOME" generated="never" lazy="false" name="Cognome" type="string"/>
    <property column="DATA" generated="never" lazy="false" name="Data" type="date"/>
    <property column="IDRUBRICA" generated="never" lazy="false" name="Idrubrica" type="int"/>
    <property column="NOME" generated="never" lazy="false" name="Nome" type="string"/>
    <property column="VIA" generated="never" lazy="false" name="Via" type="string"/>
    <property column="PROPRIETARIO" generated="never" lazy="false" name="Proprietario" type="string" insert="false" update="false" />
    
    <sql-insert>insert into CONTATTI (CAP, COGNOME, DATA, IDRUBRICA, NOME, VIA) values (?, ?, ?, ?, ?, ?)</sql-insert>
    <sql-update>update CONTATTI set CAP=?,COGNOME=?,DATA=?,IDRUBRICA=?,NOME=?, VIA=? where IDCONTATTO=?</sql-update>
    <sql-delete>delete from CONTATTI where IDCONTATTO =?</sql-delete>
    </class>
    <hibernate-mapping>
    Nel caso specifico vorrei che la seguente property venisse mappata come transient: property column="PROPRIETARIO
    Le ho provate tutte, ma nulla

    Riuscite a diautarmi???


    Grazie, Max

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Sarà che forse non ho ben capito cosa vuoi ottenere... ma se una proprietà è transient (ovvero, non va resa persistente) è perchè nella tabella del DB tale campo non esiste... altrimenti perchè renderla transient?

    Solitamente le proprietà transient sono proprietà che esistono nella classe Java che manipola i dati, ma che servono solo a runtime lato Java... perchè nel Database non servono, non hanno senso di esistere e, di conseguenza, non ha senso che vengano rese persistenti.

    Ergo: non devono avere alcuna mappatura nel file XML (che serve ad Hibernate per capire quali campi della tabella devono essere mappati su qiali proprietà della classe Java). Poi, sarà che io non ho mai usato i file XML di mappatura (li ritengo obsoleti e poco maneggevoli, da quando esiste la JPA)...

    Tra parentesi... se non ricordo male, i campi del POJO che non hanno una mappatura nel file XML sono automaticamente transient.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Ciao e grazie per la risposta.

    Io purtroppo ho questa casistica.
    codice:
    <class name="Pippo.web.entities.Contatti" table="VW_CONTATTI">
    Come vedi la table di riferimento è VW_CONTATTI, che in realtà indica una vista del database e non la tabella CONTATTI. Nella vista ho dei campi aggiuntivi, che non sono della tabella CONTATTI, ma che sono lette da altre tabelle relazionate a contatti (Nell'esempio PROPRIETARIO viene letto da una tabella che si chiama RUBRICA).

    Di conseguenza il mio oggetto Contatti dovrà contenere la property PROPRIETARIO, ma questa property non deve venir considerata nelle operazioni di persistenza.

    Spero di essere stato più chiaro. Come ti dicevo sono nuovo di questo mondo (non vorrei scrivere bestialità) :-)

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Ora, non vorrei sbagliarmi (mai mi sono trovato di fronte a scenari simili), ma non credo proprio che una VIEW possa essere presa come base per la persistenza. Si possono mappare le View esattamente come fossero delle tabelle, ma credo siano read-only... del resto, una view non è una tabella, non contiene di per sé dati (che, appunto, risiedono sulle tabelle)... paradossalmente, una view potrebbe contenere campi calcolati e aggregati, e, contestualmente, non contenere campi di una tabella che siano chiave esterna, quindi che aggiornamento potrebbe essere fatto a tali campi?

    Comunque, mi pare sia possibile definire una mappatura assegnandogli le proprietà insert="false" update="false".


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    Hai centrato in pieno la casistica :-)

    Le insert-Update-delete non vengono infatti fatte sulla view, ma sulla tabella, grazie alle seguenti righe nell'XML
    codice:
    <sql-insert>insert into CONTATTI (CAP, COGNOME, DATA, IDRUBRICA, NOME, VIA) values (?, ?, ?, ?, ?, ?)</sql-insert>
    <sql-update>update CONTATTI set CAP=?,COGNOME=?,DATA=?,IDRUBRICA=?,NOME=?, VIA=? where IDCONTATTO=?</sql-update>
    <sql-delete>delete from CONTATTI where IDCONTATTO =?</sql-delete>
    Inoltre come Punto fermo di progetto, le view contengono sempre ALMENO tutti i campi della tabella.

    Nell'unico campo non appartenenete alla tebella (PROPRIETARIO) ho già usato gli attributi insert ed update come giustamente da te indicato:
    codice:
    <property column="PROPRIETARIO"  name="Proprietario" type="string" insert="false" update="false" />

    Tutto dovrebbe funzionare, ma il problema e che quando hibernate va a fare la insert, ottengo il seguente errore
    codice:
    Get Message:java.sql.SQLException: Indice di colonna non valido org.hibernate.exception.GenericJDBCException: could not insert
    L'errore è dovuto al fatto che Hibernate considera l'oggetto di N colonne (PROPERTY), mentre nella definizione della INSERT si ritrova con N-1 colonne.

    L'unico modo sarebbe definire la colonna aggiuntiva PROPRIETARIO come @transient, ma è proprio questo che non riesco a fare.


    Ti viene in mente qualcosa per aiutarmi?

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Non credo vi sia un modo per mappare come transient un campo all'interno del file XML. Ciò va fatto nella classe Java e per farlo hai due modi:

    1) Usare la annotazione @Transient
    2) Dichiarare il campo come transient

    codice:
    // Uso l'annotazione
    @Transient
    private String campo;
    
    // Uso la parola chiave transient
    private transient String campo;
    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.