您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

如何使用JPA将Map(java.util.Map)对象持久保存在实体中并确保持久性级联?

如何使用JPA将Map(java.util.Map)对象持久保存在实体中并确保持久性级联?

我设法使用Java Ka Baby的建议解决了这个问题。这个问题实际上不在我的Model@H_403_2@课堂上;问题在于Controller@H_403_2@。具体来说,我以错误的顺序保存了实体。一旦意识到使用@ElementCollection@H_403_2@注释Map<Long, Foo>@H_403_2@产生的效果与我手动指定的连接表相同,便尝试进行实验,重新思考如何保存实体。

在上面发布的代码中,您可以在FooSystem@H_403_2@构造函数中看到在持久化对象之前已放入两个Foo@H_403_2@对象f1@H_403_2@和。我意识到,如果将它放入地图中时不在数据库中,那么JPA如何将其ID用作联接表中的外键?f2``fooMap``Foo``f1@H_403_2@

如果您可以看到我要使用的这种推理方法,那么您会发现显而易见的答案是,JPA 无法 完成使用外键引用不存在的键这一惊人的壮举。奇怪的是那出戏!控制台根本没有记录我发布的原始代码的任何错误,即使它根本不正确。要么框架吞噬了Exception@H_403_2@在此过程中抛出的所有错误,要么是我编写了应该 产生的代码Exception@H_403_2@。

因此,为解决此问题,我在对Foo@H_403_2@实体执行任何操作之前将其保留下来。然后才把它们放进去fooMap@H_403_2@。最后,一旦fooMap@H_403_2@填充完毕,我便保留了该FooSystem@H_403_2@实体。

这是更正后的TestController@H_403_2@类:

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();
    }
}
@H_403_2@

而且,由于我进行了更改FooSystem@H_403_2@,因此这是该类的最终代码

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>();

    public FooSystem()
    {
    }

    public Map<Long, Foo> getFooMap()
    {
        return fooMap;
    }

    public void put(Long l, Foo f)
    {
        fooMap.put(l, f);
    }
}
@H_403_2@
java 2022/1/1 18:20:52 有514人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶