Как использовать JPA для сохранения объекта Map (java.util.Map) внутри сущности и обеспечить каскадное сохранение?

Недавно я начал играть с Play! Framework для Java, версия 1.2.3 (последняя). В процессе тестирования фреймворка я столкнулся со странной проблемой при попытке сохранить объект Map внутри сущности Hibernate под названием FooSystem. Объект Map отображает long на сущность Hibernate, которую я назвал Foo, с объявлением Map 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();
    }
}

Фреймворк Play! автоматически создал транзакцию для HTTP запроса. Хотя данные вставляются в таблицы foo и foosystem, в таблицу foomap ничего не вставляется, что является желаемым результатом. Что я могу с этим сделать? Что я упускаю?

8
задан fruchtose 22 September 2011 в 20:39
поделиться