在Play中使用Map作为模型的属性

时间:2011-05-17 15:34:52

标签: java hibernate playframework

我正在尝试将Map用作我的某个模型属性的类型。我们以这两个类为例:

@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

当然我试着谷歌但是找不到我的案例的任何解决方案。有什么想法吗?有趣的是,我可以在之后更改数据库中的值,并将bar2分配给foo1,这一切都很好,所以我不能太错......

非常感谢帮助:)

最佳, kalarzo

3 个答案:

答案 0 :(得分:2)

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

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

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

play install associations

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

require:
    - play -> associations 1.0

答案 1 :(得分:0)

我在使用Fixtures的v1.2.3中遇到了同样的问题。奇怪的是,如果我没有在具有双向Map OneToMany关系的工具下面定义一个夹具,则没有问题。如果我没有完全设置双向关系,我的一个控制器也遇到了问题。它似乎与在双向OneToMany关系中使用Map直接相关。我切换到Set,问题就消失了。最后,我设法解决了这种情况,而没有通过升级到v1.2.4RC2恢复到Set。我快速浏览了v1.2.4RC2中的更改列表,但无法发现任何直接提到修复此问题的内容,但必须解决一些问题。

答案 2 :(得分:-1)

删除:

@MapKey(name = "name")