Сопоставление коллекции строк и Enum с помощью Ebean (Play 2.0)

У меня проблемы с отображением коллекции строк и перечислений в моих сущностях. Я следовал разным советам, но, похоже, ничего не работает. Я использую 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_foobar и bar_strings, если аннотации были правильными.

При использовании переменной arrayOfString я получаю запутанное сообщение об ошибке при запуске приложения (которое связано со случайным объектом, не обязательно Foo.class

PersistenceException: ошибка с [models.user.User] Он не был улучшен, но это суперкласс [class play.db.ebean.Model]? (Вы не можете смешивать улучшения в одной иерархии наследования) marker[play.db.ebean.Model] className[models.user.User]

Я знаю, что могу обернуть свои строки и перечисления в сущности и использовать отношение @ManyToMany, но мысль об этом заставляет меня дрожать. Есть ли здесь ошибка в Play 2.0 или Ebean (с использованием версии 2.7.3)? Есть ли другие способы решить мою проблему?


person kvitso    schedule 05.05.2012    source источник


Ответы (2)


Отображение коллекций еще не реализовано в Ebean. EBEAN-378 Все, что вы можете сделать, это реализовать сопоставление самостоятельно. Аннотацию @PrivateOwned можно использовать на стороне Foo, чтобы гарантировать, что строки не останутся в БД, если они будут удалены из коллекции.

person allprog    schedule 22.12.2012

Это известная проблема в версии 2.0 (ссылка), но быть исправлено в 2.0.1.

Изменить: для ясности под словом «это» подразумевается PersistenceException.

person Leonard Punt    schedule 06.05.2012
comment
Спасибо за ответ. Это касается PersistenceException, верно? На самом деле я пытался обновиться до 2.0.1 и после этого получил такое же исключение. Но, может быть, мне нужно собрать проект с нуля с 2.0.1, чтобы решить эту проблему? Мой главный вопрос был о сопоставлении String/Enum, извините за добавление второго вопроса в пост. - person kvitso; 06.05.2012