本文介绍了在 Play 中使用 Map 作为模型的属性的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用 Map 作为我的模型属性之一的类型.我们以这两个类为例:

I'm trying to use a Map as a type for one of my models properties. Let's take these two classes for example:

@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 中的键.

Very simplified of course, but that's the basic idea.So what I'm trying to achieve is get a map with Bars as values and the names as their keys into Foo.

现在我想利用 Fixture 从这个 YAML 文件中加载一些数据:

Now I want to utilize Fixture to load some data from this YAML file:

Foo(foo1):
    name: Foo1

Foo(foo2):
    name: Foo2

Bar(bar1):
    name: Bar1
    foo: foo1

Bar(bar2):
    name: Bar2
    foo: foo1

到目前为止没有问题,这很有效.现在,如果我尝试将 bar2 更改为 foo: foo2,则会出现此异常:

No problems so far, this works like a charm. Now if I try to change bar2 to foo: foo2, I get this Exception:

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

当然,我试图用谷歌搜索它,但找不到适合我的案例的任何解决方案.对此有何想法?有趣的是,我可以在之后更改数据库中的值并将 bar2 分配给 foo1 并且一切正常,所以我不会错...

Of course I tried to google it but couldn't find any solution for my case. Any ideas on that? Funnily enough, I can go and change the values in the database afterwards and assign bar2 to foo1 and it all works perfectly fine, so I can't be too wrong...

非常感谢帮助:)

最好的,卡拉佐

推荐答案

我今天尝试了你的代码,它没有问题.你用的哪个播放版本?我使用 1.2.3.

I tryed your code today and it worked without problems. Which play version do you use? I use 1.2.3.

也许插件 association 解决了这个问题,因为这就是我在后台使用.如果升级对您有帮助,请告诉我.

Maybe the plugin association solves that problem, because that is what I'm using in background.Please let me know if an upgrade helped you.

遵循标准播放模块安装程序:

Follows standard play module installation procedure:

play install associations

将以下行添加到您的 dependencies.yml 中,将 1.0 替换为所需的版本:

Add the following line to your dependencies.yml replacing 1.0 with desired version:

require:
    - play -> associations 1.0

这篇关于在 Play 中使用 Map 作为模型的属性的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

07-23 08:49