JPA: differenza tra "@MappedSuperclass" e "@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)"

338 views
Skip to first unread message

Enrico Giurin

unread,
Nov 25, 2009, 8:15:18 AM11/25/09
to JUG Padova
Ciao,
il soggetto della mail dice praticamente tutto, non riesco a capire
quale sia la differenza nella sostanza nel dichiare comme annotation
nella mia parent class una delle due annotation.
Usato con parancoe mi funziona solo la prima soluzione
(@MappedSuperclass) invece non sono riuscito, anche ridefinendo getId
() nelle classi figlie a farlo funzionare con la seconda annotation
(@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS))

A prescindere comunque dal funzionamento con il framework parancoe
volevo sapere se anche secondo voi agli effetti pratici non vi è
nessuna differenza nell' usare una o l'altra di queste JPA annotation.

Grazie,
Enrico.

Lucio Benfante

unread,
Nov 25, 2009, 8:20:31 AM11/25/09
to jugp...@googlegroups.com
Enrico Giurin ha scritto:

Ciao,
come fai a dire che non ci sono differenze?

Con @MappedSuperclass semplicemente dici che la superclasse contiene
delle annotazioni che devono essere usate per il mapping delle
sottoclassi. Non c'è nessuna gerarchia di ereditarietà per i dati
mappati: sono totalmente indipendenti.

Con @Inheritance invece i dati mappati sono in relazione gerarchica.
Quindi, ad esempio, una query sull'entità padre produce come risultati
anche istanze delle entità figlie.

Ciao
Lucio

--
Lucio Benfante
JUG Padova http://www.parancoe.org ...have a look at it!
www.jugpadova.it http://www.jugevents.org


Enrico Giurin

unread,
Nov 25, 2009, 8:41:39 AM11/25/09
to JUG Padova


On Nov 25, 2:20 pm, Lucio Benfante <lucio.benfa...@jugpadova.it>
wrote:
[cut]
> Ciao,
> come fai a dire che non ci sono differenze?
Sono sicuro che c'è una differenza ma comunque avevo parlato di
differenza sostanziale,
infatti usando @MappedSuperclass ottengo proprio quanto desiderato,
ovvero lato java uso il concetto di ereditarietà e lato DB ho
differenti tabelle come volevo.
>
> Con @MappedSuperclass semplicemente dici che la superclasse contiene
> delle annotazioni che devono essere usate per il mapping delle
> sottoclassi. Non c'è nessuna gerarchia di ereditarietà per i dati
> mappati: sono totalmente indipendenti.
Non capisco, cosa intendi per dati mappati? Le tabelle associate alle
classi che estendono la mia superclasse hanno esattamente gli
attributi definiti nella superclasse, ed è proprio quanto volevo.
Non capisco cosa di diverso avrei potuto ottenere da un punto di vista
sostanziale usando @Inheritance , che ripeto con parancoe non c'è
verso di far funzionare.
>
> Con @Inheritance invece i dati mappati sono in relazione gerarchica.
> Quindi, ad esempio, una query sull'entità padre produce come risultati
> anche istanze delle entità figlie.
>
Ripeto non capisco la differenza pratica.

Lucio Benfante

unread,
Nov 25, 2009, 8:58:21 AM11/25/09
to jugp...@googlegroups.com
Enrico Giurin ha scritto:

On Nov 25, 2:20 pm, Lucio Benfante <lucio.benfa...@jugpadova.it>
wrote:
[cut]
  
Ciao,
come fai a dire che non ci sono differenze?
    
Sono sicuro che c'è una differenza ma comunque avevo parlato di
differenza sostanziale,
infatti usando @MappedSuperclass ottengo proprio quanto desiderato,
ovvero lato java uso il concetto di ereditarietà e lato DB ho
differenti tabelle come volevo.
  
Con @MappedSuperclass semplicemente dici che la superclasse contiene
delle annotazioni che devono essere usate per il mapping delle
sottoclassi. Non c'è nessuna gerarchia di ereditarietà per i dati
mappati: sono totalmente indipendenti.
    
Non capisco, cosa intendi per dati mappati? Le tabelle associate alle
classi che estendono la mia superclasse hanno esattamente gli
attributi definiti nella superclasse, ed è proprio quanto volevo.
Non capisco cosa di diverso avrei potuto ottenere da un punto di vista
sostanziale usando @Inheritance , che ripeto con parancoe non c'è
verso di far funzionare.
  

Funziona, funziona...te lo assicuro. Leggiti bene la documentazione JPA (è inutile che continui a scaricare le colpe su Parancoe quando non ti funziona qualcosa...soprattutto sulle cose in cui Parancoe non c'entra nulla, come il mapping delle entità)

La differenza è quella che ti ho detto: con @Inheritance i dati hanno un legame di ereditarietà, con @MappedSuperclass no, il legame è solo fra le classi.

Un esempio pratico: supponi di avere la classe Persona, e le sue due sottoclassi Impiegato e Dirigente. Se hai annotato Persona con @MappedSuperclass, non sarà nemmeno un'entità, e non potrai fare query del tipo "from Persona p where..". Viceversa se l'hai annotata con @Inheritance, essa sarà un'entità, e una query come quella detta prima sarà possibile, e restituirà istanze sia di tipo Impiegato, sia di tipo Dirigente.

Enrico Giurin

unread,
Nov 25, 2009, 9:07:48 AM11/25/09
to JUG Padova


On Nov 25, 2:58 pm, Lucio Benfante <lucio.benfa...@jugpadova.it>
wrote:
[CUT]
>
> Funziona, funziona...te lo assicuro. Leggiti bene la documentazione JPA
> (è inutile che continui a scaricare le colpe su Parancoe quando non ti
> funziona qualcosa...soprattutto sulle cose in cui Parancoe non c'entra
> nulla, come il mapping delle entità)
>
Ok scusa non voglio scaricare le colpe, figurati, diciamo che non sono
riuscito a farlo funzionare, se magari mi fornisci un esempio valido
te ne sarei grato :)
Pero' anche usando @MappedSuperclass ho dovuto rinunciare ad estendere
EntityBase di parancoe perchè anche in questo caso mi dava problemi ma
invece ho implementato
org.parancoe.persistence.po.hibernate.Entity nella mia parent class,
ok sempre di utilizzo di parancoe si tratta.
> La differenza è quella che ti ho detto: con @Inheritance i dati hanno un
> legame di ereditarietà, con @MappedSuperclass no, il legame è solo fra
> le classi.
>
> Un esempio pratico: supponi di avere la classe Persona, e le sue due
> sottoclassi Impiegato e Dirigente. Se hai annotato Persona con
> @MappedSuperclass, non sarà nemmeno un'entità, e non potrai fare query
> del tipo "from Persona p where..". Viceversa se l'hai annotata con
> @Inheritance, essa sarà un'entità, e una query come quella detta prima
> sarà possibile, e restituirà istanze sia di tipo Impiegato, sia di tipo
> Dirigente.
Ok una cosa di cui assolutamente non ho bisogno nel mio caso perchè
appunto nel mio caso volevo solo evitare di ridefinire gli stessi
attributi per queste entità che anche se rappresentano cose diverse
hanno esattamente gli stessi attributi.
Comunque grazie dell' esempio, mi ha aiutato a capire.:)
[cut]

Lucio Benfante

unread,
Nov 25, 2009, 9:19:19 AM11/25/09
to jugp...@googlegroups.com
Enrico Giurin ha scritto:
Ok scusa non voglio scaricare le colpe, figurati, diciamo che non sono
riuscito a farlo funzionare, se magari mi fornisci un esempio valido
te ne sarei grato :)
  

Enrico Giurin

unread,
Nov 25, 2009, 10:01:41 AM11/25/09
to JUG Padova
Grazie Lucio,
ma avevo specificato che non mi funziona per questa annotation:

"@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)"

Sono infatti riuscito ad implementarlo per il mio progetto con
@Inheritance(strategy=InheritanceType.JOINED)
e un esempio del tipo come quello di scarabocio (@Inheritance
(strategy=InheritanceType.SINGLE_TABLE))
c'è anche in Jugevents per la classe EventResource.





On Nov 25, 3:19 pm, Lucio Benfante <lucio.benfa...@jugpadova.it>
wrote:
> Enrico Giurin ha scritto:
>
> > Ok scusa non voglio scaricare le colpe, figurati, diciamo che non sono
> > riuscito a farlo funzionare, se magari mi fornisci un esempio valido
> > te ne sarei grato :)
>
> Ad esempio puoi guardare queste due classi di Scarabocio:
>
> http://code.google.com/p/scarabocio/source/browse/trunk/scarabocio/sr...http://code.google.com/p/scarabocio/source/browse/trunk/scarabocio/sr...
>
> Ciao
>   Lucio
>
> --
> Lucio Benfante
> JUG Padova          http://www.parancoe.org...have a look at it!www.jugpadova.it   http://www.jugevents.org
>
>  smime.p7s
> 7KViewDownload

Lucio Benfante

unread,
Nov 26, 2009, 3:57:42 AM11/26/09
to jugp...@googlegroups.com
Enrico Giurin ha scritto:

> Grazie Lucio,
> ma avevo specificato che non mi funziona per questa annotation:
>
> "@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)"
>

Ora ho capito.

Sì, in effetti non puoi farlo se vuoi usare EntityBase, perchè in quella
classe la strategia di generazione della chiave primaria è AUTO, il che
significa che potrebbe essere anche IDENTITY, e IDENTITY non può essere
usata con una strategia di ereditarietà TABLE_PER_CLASS.

Purtroppo non c'è modo (che io sappia...se qualcuno lo sa...grazie se ce
lo dice) di fare l'overriding di tale definizione in una sottoclasse.
Quiundi l'unica soluzione è non usare EntityBase, ma definire l'Id e
tutto quello che serve nella propria classe (o definirsi una nuova
classe base con un'opportuna strategia di generazione).

Ciao
Lucio

--
Lucio Benfante

Reply all
Reply to author
Forward
0 new messages