2011-01-25 15 views
7

Estoy empezando a construir mi esquema JPA en una aplicación web de Play Framework. Tengo una comprensión razonable de SQL, pero soy un novato de JPA, y me estoy tropezando en el primer obstáculo.Problema básico de JPA: "No se pudo determinar el tipo para: java.util.Set"

De los tutoriales de Juego supongo que solo crea sus clases de Java y JPA/Play creará automáticamente el esquema para usted.

Así que quieren crear una relación ManyToMany entre dos clases del modelo, clasificable y Etiqueta:

@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; 
    } 
} 

y la otra clase:

@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; 
    } 
} 

Pero sigo recibiendo el siguiente error:

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)]

¿Qué estoy haciendo mal?

+0

lo que se ve como modelo? – kem

+1

@kem - [Modelo] (http://www.playframework.org/documentation/api/1.1.1/play/db/jpa/Model.html) es una de las clases de framework –

+0

¿Es el '}' extra en su código o simplemente un error de publicación? –

Respuesta

2

Al final, esto parecía funcionar, aunque no estoy seguro de por qué:

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

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

y

@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

Parece que @ManyToMany no surte efecto.

Quizás sea un poco confuso con la colocación de las anotaciones. Asegúrese de que sus getters tengan los setters correspondientes (setTags()) y todas las demás anotaciones también se colocan en las propiedades (no en los campos).

+0

Ah, no tenía los setters correspondientes. ¿Necesitan tener las mismas anotaciones que los setters? – sanity

+0

No, agregué setters, y todas las anotaciones están en métodos, no en campos (actualmente solo tengo dos objetos de modelo, y ambos están pegados arriba). Sigue apareciendo el mismo error :-( – sanity

+2

No necesita declarar setters en un modelo de Play Framework ya que el framework los genera dinámicamente en tiempo de compilación. –

7

En nuestro caso, la razón era que teníamos algunas anotaciones en el campo y algunos en los captadores. En otras palabras, para un campo específico, las anotaciones deben estar en el campo o en el captador. Combinarlos en los getters resolvió el problema para nosotros. Parece que la excepción no muestra la verdadera causa del problema. Por cierto, hemos utilizado este sintaxis de las anotaciones ManyToMany:

  1. Entidad:

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

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

¿Qué tal uno a uno? Es lo mismo ? –

Cuestiones relacionadas