Использовать карту как свойство модели в Play - PullRequest
7 голосов
/ 17 мая 2011

Я пытаюсь использовать карту в качестве типа для одного из свойств моих моделей.Давайте возьмем эти два класса, например:

@Entity
public class Foo extends Model {

    @OneToMany(mappedBy = "foo", cascade = CascadeType.ALL)
    @MapKey(name = "name")
    public Map<String, Bar> bars;

    public String name;

}

@Entity
public class Bar extends Model {

    @ManyToOne
    public Foo foo;

    public String name;
}

Очень упрощенно, конечно, но это основная идея.Поэтому я пытаюсь получить карту с Bars в качестве значений и имена в качестве ключей в Foo.

Теперь я хочу использовать Fixture для загрузки некоторых данных из этого файла YAML:

Foo(foo1):
    name: Foo1

Foo(foo2):
    name: Foo2

Bar(bar1):
    name: Bar1
    foo: foo1

Bar(bar2):
    name: Bar2
    foo: foo1

Пока проблем нет, это работает как шарм.Теперь, если я попытаюсь изменить bar2 на foo: foo2, я получу это исключение:

play.exceptions.JavaExecutionException: Cannot load fixture initial-data.yml: org.hibernate.HibernateException: Found two representations of same collection: models.Foo.bars
    at play.jobs.Job.call(Job.java:166)
    at Invocation.Job(Play!)
Caused by: java.lang.RuntimeException: Cannot load fixture initial-data.yml: org.hibernate.HibernateException: Found two representations of same collection: models.Foo.bars
    at play.test.Fixtures.loadModels(Fixtures.java:221)
    at jobs.Bootstrap.doJob(Bootstrap.java:18)
    at play.jobs.Job.doJobWithResult(Job.java:55)
    at play.jobs.Job.call(Job.java:157)
    ... 1 more
Caused by: javax.persistence.PersistenceException: org.hibernate.HibernateException: Found two representations of same collection: models.Foo.bars
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1214)
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1147)
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1153)
    at org.hibernate.ejb.AbstractEntityManagerImpl.flush(AbstractEntityManagerImpl.java:798)
    at play.db.jpa.JPABase._save(JPABase.java:47)
    at play.test.Fixtures.loadModels(Fixtures.java:205)
    ... 4 more
Caused by: org.hibernate.HibernateException: Found two representations of same collection: models.Foo.bars
    at org.hibernate.engine.Collections.processReachableCollection(Collections.java:175)
    at org.hibernate.event.def.FlushVisitor.processCollection(FlushVisitor.java:60)
    at org.hibernate.event.def.AbstractVisitor.processValue(AbstractVisitor.java:122)
    at org.hibernate.event.def.AbstractVisitor.processValue(AbstractVisitor.java:83)
    at org.hibernate.event.def.AbstractVisitor.processEntityPropertyValues(AbstractVisitor.java:77)
    at org.hibernate.event.def.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:165)
    at org.hibernate.event.def.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:240)
    at org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:99)
    at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50)
    at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1216)
    at org.hibernate.ejb.AbstractEntityManagerImpl.flush(AbstractEntityManagerImpl.java:795)
    ... 6 more    

at org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:99)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1216)
at org.hibernate.ejb.AbstractEntityManagerImpl.flush(AbstractEntityManagerImpl.java:795)
... 6 more

Конечно, я пытался найти его в Google, но не смог найти никакого решения для своего случая.Есть идеи по этому поводу?Как ни странно, я могу потом пойти и изменить значения в базе данных и назначить bar2 для foo1, и все это прекрасно работает, так что я не ошибаюсь ...

Помощь будет принята с благодарностью :)

Бест, каларзо

Ответы [ 3 ]

2 голосов
/ 04 ноября 2011

Я попробовал ваш код сегодня, и он работал без проблем.Какую игровую версию вы используете?Я использую 1.2.3.

Возможно, плагин ассоциация решает эту проблему, потому что это то, что я использую в фоновом режиме.Пожалуйста, дайте мне знать, если обновление помогло вам.

Следует стандартной процедуре установки игрового модуля:

play install associations

Добавьте следующую строку в ваш dependencies.yml , заменив 1.0 нужной версией:

require:
    - play -> associations 1.0
0 голосов
/ 18 ноября 2011

У меня была такая же проблема в v1.2.3 с Fixtures. Странно, если бы я не определил прибор ниже того, который имеет двунаправленное отношение Map OneToMany, проблем не было. У меня также была проблема в одном из моих контроллеров, если я не настроил двунаправленные отношения полностью. Кажется, это напрямую связано с использованием карты в двунаправленном отношении OneToMany. Я переключился на набор, и проблема ушла. В конце концов мне удалось разрешить ситуацию, не возвращаясь к набору путем обновления до v1.2.4RC2. Я быстро просмотрел список изменений в версии 1.2.4RC2, но не смог найти ничего, что прямо упоминало бы об исправлении этой проблемы, но что-то должно быть решено.

0 голосов
/ 18 июля 2011

Удалить:

@MapKey(name = "name")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...