我最近开始玩Play!Java框架1.2.3版(最新)。在测试框架时,尝试Map
在名为的Hibernate实体中保留对象时遇到了一个奇怪的问题FooSystem
。地图对象映射长到Hibernate的实体,我呼吁Foo
,随着申报Map<Long, Foo> fooMap;
我的问题如下:按照我的注释创建正确的表。但是,当FooSystem
对象fs
持久化时,其中的数据fs.fooMap
就不会!
这是我用于实体的代码。首先是Foo
:
package models.test;
import javax.persistence.Entity;
import javax.persistence.ManyToOne;
import play.db.jpa.Model;
@Entity
public class Foo extends Model
{
@ManyToOne
private FooSystem foosystem;
public Foo(FooSystem foosystem)
{
this.foosystem = foosystem;
}
}
这里是FooSystem
:
package models.test;
import java.util.HashMap;
import java.util.Map;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import play.db.jpa.Model;
@Entity
public class FooSystem extends Model
{
@ManyToMany(cascade = {CascadeType.ALL, CascadeType.PERSIST})
@JoinTable(
name = "fooMap",
joinColumns = @JoinColumn(name = "foosystem"),
inverseJoinColumns = @JoinColumn(name = "foo")
)
private Map<Long, Foo> fooMap = new HashMap<Long, Foo>();
public FooSystem()
{
Foo f1 = new Foo(this);
Foo f2 = new Foo(this);
fooMap.put(f1.getId(), f1);
fooMap.put(f2.getId(), f2);
}
public Map<Long, Foo> getFooMap()
{
return fooMap;
}
}
这是Controller
我用来测试设置的课程:
package controllers;
import javax.persistence.EntityManager;
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();
em.persist(fs);
render();
}
}
表演!框架会自动为HTTP请求创建一个事务。尽管将数据插入到foo
和foosystem
表中,但是什么也没有插入到foomap
表中,这是理想的结果。我该怎么办?我想念什么?
我设法使用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;
@Entity
public class FooSystem extends Model
{
@ElementCollection
private Map<Long, Foo> fooMap = new HashMap<Long, Foo>();
html" target="_blank">public FooSystem()
{
}
public Map<Long, Foo> getFooMap()
{
return fooMap;
}
public void put(Long l, Foo f)
{
fooMap.put(l, f);
}
}
问题内容: 我最近开始玩Play!Java框架1.2.3版(最新)。在测试框架时,尝试在名为的Hibernate实体中保留对象时遇到了一个奇怪的问题。地图对象映射长到Hibernate的实体,我呼吁,随着申报 我的问题如下:按照我的注释创建正确的表。但是,当对象持久化时,其中的数据就不会! 这是我用于实体的代码。首先是: 这里是: 这是我用来测试设置的课程: 表演!框架会自动为HTTP请求创建一个
问题内容: 我创建了一个这样的对象: 我想保存该对象。我怎样才能做到这一点? 问题答案: 你可以使用标准库中的模块。这是你的示例的基本应用: 你还可以定义自己的简单实用程序,如下所示,该实用程序打开文件并向其中写入单个对象: 更新资料 由于这是一个非常受欢迎的答案,因此,我想谈谈一些高级用法主题。 实际使用该cPickle模块几乎总是可取的,而不是因为该模块是用C编写的并且速度更快。它们之间有一些
java 持久实体
我使用StreamRefs在集群中的参与者之间建立流式连接。目前,在writing节点中,我手动将传入消息保存到日志文件中,但我想知道是否可以将其替换为persistent,用于写入,以及persistent,用于从Akka Persistence journal启动actor时读取。我一直在考虑用Persistent actor的
我已经开始使用推荐的,并不再使用。其中一件我无法粘合的事情是使用持久的cookie存储。我只想在我的连接上附加一个定制的cookie处理程序/管理器来存储cookie。Android文档并没有太大帮助,因为它将有关cookie的主题概括为两行。 我之前一直在使用LoopJ的PersistentCookieStore,效果很好。 关于如何在Android中设置一个持久的cookie存储,我可以附加到
我与以下实体类有一个双向的一对多关系: 当然,所有必需的级联选项都是在客户端设置的。但如果在引用现有产品订单时首次持久化新创建的客户端(如本场景所示),则它将不起作用: 已创建并持久化产品订单“%1”。工作正常。 已创建客户端“%2”,并将产品订单“%1”添加到其产品订单列表中。然后它被持久化。不起作用。 我尝试了几个apporach,但没有一个显示出预期的结果。请参阅下面的结果。我在这里阅读了所