使用Ebean映射String和Enum的集合(Play 2.0)

时间:2012-05-05 01:41:05

标签: java jpa playframework-2.0 ebean

我在实体中映射字符串和枚举的集合时遇到问题。我遵循了不同的建议,但似乎没有任何效果。我正在使用PlayFramework 2.0和提供的Ebean作为ORM。

这是一个插图类:

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

启动应用程序时生成的DDL如下所示:

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

如果注释正确,我希望同时创建表bar_foobarbar_strings

如果使用arrayOfString变量,我会在应用程序启动时收到一条错误的错误消息(与随机实体相关,不一定是Foo.class

  

PersistenceException:[models.user.User]错误它还没有   增强但是它的superClass [class play.db.ebean.Model]是? (你是   不允许在单个继承层次结构中混合增强)   marker [play.db.ebean.Model] className [models.user.User]

我知道我可以将我的字符串和枚举包装在实体中,并使用@ManyToMany关系,但想到它会让我颤抖。 Play 2.0或Ebean中是否存在错误(使用v2.7.3)?还有其他方法可以解决我的问题吗?

2 个答案:

答案 0 :(得分:1)

尚未在Ebean中实现集合映射。 EBEAN-378您所能做的就是自己实施映射。可以在@PrivateOwned侧使用Foo注释,以确保如果从集合中删除字符串,则不会保留在数据库中。

答案 1 :(得分:0)

这是2.0(link)中的已知问题,但应在2.0.1中修复。

编辑:为清楚起见,'this'指的是PersistenceException。