2012-05-05 1 views
10

J'ai des problèmes de mappage d'une collection de chaînes et d'énumérations dans mes entités. J'ai suivi différents conseils, mais rien ne semble fonctionner. J'utilise PlayFramework 2.0 et le Ebean fourni comme ORM.Mappage de collection de chaînes et d'enum avec Ebean (Lecture 2.0)

Voici une classe d'illustration:

package models; 

import java.util.*; 
import javax.persistence.*; 
import play.db.ebean.Model; 

@Entity 
@Table(name = "foo") 
public class Foo extends Model { 

    private static final long serialVersionUID = 1L; 

    private enum FooBar { 
     FOO, BAR; 
    } 

    @Id 
    public Long id; 

    @ElementCollection 
    @Enumerated(EnumType.STRING) 
    @CollectionTable(name = "bar_foobar", 
     joinColumns = @JoinColumn(name = "bar_id", 
      referencedColumnName = "id")) 
    @Column(name = "foobar") 
    public List<FooBar> fooBars; 

    @ElementCollection(targetClass = String.class) 
    @CollectionTable(name = "bar_strings", 
     joinColumns = @JoinColumn(name = "bar_id")) 
    @Column(name = "string", nullable = false)  
    public List<String> listOfStrings; 

    @Basic 
    public List<String> listOfStrings2; 

    // Attempt to circumvent the issue, but this gives a strange error 
    //public String[] arrayOfString; 
} 

Le DDL généré lorsque l'application est lancée ressemble à ceci:

create table foo (
id  bigint not null, 
constraint pk_foo primary key (id)) 
; 

je me attends de voir les deux tables bar_foobar et bar_strings créés, si les annotations étaient correctes.

Si vous utilisez la variable arrayOfString, je reçois un message weired erreur lors du lancement de l'application (qui se rapporte à une entité au hasard, pas nécessairement Foo.class

PersistenceException: Erreur avec [models.user.User] Il n'a pas été amélioré mais c'est superClass [classe play.db.ebean.Model] est? (Vous n'êtes pas autorisé à mélanger amélioration dans une hiérarchie d'héritage unique) marqueur [play.db.ebean.Model] className [modèles .user.User]

Je sais que je pourrais envelopper mes cordes et enums dans des entités, et utiliser une relation @ManyToMany, mais la pensée de cela me fait frissonner. Y a-t-il un bug ici dans Play 2.0 ou Ebean (en utilisant la version 2.7.3)? Y a-t-il d'autres façons de résoudre mon problème?

Répondre

0

Ceci est un problème connu dans 2.0 (link), mais devrait être corrigé dans 2.0.1.

Modifier: Par souci de clarté, avec 'ceci' faisait référence à l'exception PersistenceException.

+0

Merci pour la réponse. C'est en ce qui concerne la PersistenceException, non? J'ai effectivement essayé de passer à la version 2.0.1, et j'ai obtenu la même exception après cela. Mais peut-être que j'ai besoin de construire le projet à partir de zéro avec 2.0.1 afin d'avoir cette solution? Ma question principale était sur le mappage String/Enum, désolé d'ajouter une deuxième question dans le message. – kvitso

1

Le mappage de collections n'est pas encore implémenté dans Ebean. EBEAN-378 Tout ce que vous pouvez faire est de mettre en œuvre vous-même la cartographie. L'annotation @PrivateOwned peut être utilisée du côté Foo pour s'assurer que les chaînes ne restent pas dans la BD si elles sont supprimées de la collection.

Questions connexes