我设法使用Java Ka
Baby的建议解决了这个问题。这个问题实际上不在我的
Model课堂上;问题在于
Controller。具体来说,我以错误的顺序保存了实体。一旦意识到使用
@ElementCollection注释
Map<Long,Foo>产生的效果与我手动指定的连接表相同,便尝试进行实验,重新思考如何保存实体。
在上面发布的代码中,您可以在
FooSystem构造函数中看到在持久化对象之前已放入两个
Foo对象
f1和。我意识到,如果将它放入地图中时不在数据库中,那么JPA如何将其ID用作联接表中的外键?
f2``fooMap``Foo``f1
如果您可以看到我要使用的这种推理方法,那么您会发现显而易见的答案是,JPA 无法
完成使用外键引用不存在的键这一惊人的壮举。奇怪的是那出戏!控制台根本没有记录我发布的原始代码的任何错误,即使它根本不正确。要么框架吞噬了
Exception在此过程中抛出的所有错误,要么是我编写了
应该 产生的代码
Exception。
因此,为解决此问题,我在对
Foo实体执行任何操作之前将其保留下来。然后才把它们放进去
fooMap。最后,一旦
fooMap填充完毕,我便保留了该
FooSystem实体。
这是更正后的
TestController类:
package controllers;import javax.persistence.EntityManager;import models.test.Foo;import models.test.FooSystem;import play.db.jpa.JPA;import play.mvc.Controller;public class TestController extends Controller{ public static void index() { EntityManager em = JPA.em(); FooSystem fs = new FooSystem(); Foo f1 = new Foo(fs); Foo f2 = new Foo(fs); f1.save(); f2.save(); fs.put(f1.getId(), f1); fs.put(f2.getId(), f2); fs.save(); render(); }}而且,由于我进行了更改
FooSystem,因此这是该类的最终代码:
package models.test;import java.util.HashMap;import java.util.Map;import javax.persistence.ElementCollection;import javax.persistence.Entity;import play.db.jpa.Model;@Entitypublic class FooSystem extends Model{ @ElementCollection private Map<Long, Foo> fooMap = new HashMap<Long, Foo>(); public FooSystem() { } public Map<Long, Foo> getFooMap() { return fooMap; } public void put(Long l, Foo f) { fooMap.put(l, f); }}


