2011-01-25 15 views
7

Ho appena iniziato a creare il mio schema JPA in un'applicazione web Play Framework. Ho una ragionevole comprensione di SQL, ma sono un principiante JPA, e sono stato inciampato al primo ostacolo.Problema JPA di base: "Impossibile determinare il tipo per: java.util.Set"

Dall'esercitazione di Play presumo che tu crei solo le tue classi Java e JPA/Play creerà automaticamente lo schema per te.

Quindi voglio creare un rapporto ManyToMany tra due classi del modello, Rankable e Tag:

@Entity 
@Inheritance(strategy = InheritanceType.JOINED) 
public class Rankable extends Model { 
    public String name; 
    private Set<Tag> tags; 

    @ManyToMany() 
    @JoinTable(name = "RANKABLE_TAGS") 
    public Set<Tag> getTags() { 
     return tags; 
    } 

    @ManyToMany() 
    @JoinTable(name = "RANKABLE_TAGS") 
    public void setTags(final Set<Tag> tags) { 
     this.tags = tags; 
    } 
} 

E l'altra classe:

@Entity 
public class Tag extends Model { 
    public String name; 
    public String description; 
    private Set<Rankable> rankables; 

    @ManyToMany(mappedBy = "tags") 
    public Set<Rankable> getRankables() { 
     return rankables; 
    } 

    @ManyToMany(mappedBy = "tags") 
    public void setRankables(final Set<Rankable> r) { 
     rankables = r; 
    } 
} 

Ma continuo a ricevere il seguente errore:

A JPA error occurred (Unable to build EntityManagerFactory): Could not determine type for: java.util.Set, at table: Rankable, for columns: [org.hibernate.mapping.Column(tags)]

Cosa sto sbagliando?

+0

ciò che fa apparire come modello? – kem

+1

@kem - [Modello] (http://www.playframework.org/documentation/api/1.1.1/play/db/jpa/Model.html) è una delle classi del framework –

+0

L'extra '}' in il tuo codice o solo un errore di pubblicazione? –

risposta

2

Alla fine questo sembrava funzionare, anche se non so perché:

@Entity 
public class Tag extends Model { 
    public String name; 
    public String description; 

    @ManyToMany(mappedBy = "tags", cascade = CascadeType.ALL) 
    public Set<Rankable> rankables; 
} 

e

@Entity 
@Inheritance(strategy = InheritanceType.JOINED) 
public class Rankable extends Model { 
    @ManyToOne(cascade = CascadeType.ALL) 
    public User creator; 

    public String name; 

    @ManyToMany() 
    public Set<Tag> tags; 
} 
0

Sembra che lo @ManyToMany non abbia effetto.

Forse è un po 'di confusione con il posizionamento delle annotazioni. Assicurati che i getters abbiano i setter corrispondenti (setTags()) e che tutte le altre annotazioni siano posizionate anche sulle proprietà (non sui campi).

+0

Ah, non ha avuto i setter corrispondenti. Hanno bisogno di avere le stesse annotazioni dei setter? – sanity

+0

No, ho aggiunto i setter - e tutte le annotazioni sono sui metodi, non sui campi (attualmente ho solo due oggetti modello, ed entrambi sono incollati sopra). Ancora lo stesso errore :-( – sanity

+2

Non è necessario dichiarare setter in un modello di Play Framework poiché sono generati dinamicamente per te dal framework in fase di compilazione. –

7

Nel nostro caso, la ragione è che abbiamo avuto alcune annotazioni sul campo e alcuni sui getter. In altre parole, per un campo specifico, le annotazioni dovrebbero essere sul campo o sul getter. Combinandoli sui getter abbiamo risolto il problema per noi. Sembra che l'eccezione non mostri la vera causa del problema. Tra l'altro, abbiamo usato questa sintassi per le annotazioni ManyToMany:

  1. Entity:

    @ManyToMany 
    @JoinTable(name = "join_table", joinColumns = { @JoinColumn(name = 
    "leftjoinid") }, inverseJoinColumns = { @JoinColumn(name = "rightjoinid") }) 
    
  2. Entity:

    @ManyToMany 
    @JoinTable(name = "join_table", joinColumns = { @JoinColumn(name = 
    "rightjoinid") }, inverseJoinColumns = { @JoinColumn(name = "leftjoinid") }) 
    
+0

che ne dici di uno a uno? È lo stesso? –

Problemi correlati