里面的ElementCollection嵌入MappedSuperclass里面

时间:2017-11-16 14:40:59

标签: java spring jpa spring-boot

我在使用JPA持久化以下构造时遇到问题。

@MappedSuperclass
public abstract class SuperFoo {
    @Embedded
    private Bar bar;

    public SuperFoo() {}

    public SuperFoo(...) {
        ...
        this.bar = new Bar("barKey");
    }

    ...

    public void setBar(Bar bar) {
        this.bar = bar;
    }

    public Bar getBar() {
        return bar;
    }
}
@Embeddable
public class Bar {
    @ElementCollection
    Map<String, Long> durations;

    @ElementCollection
    Map<String, Integer> integers;

    public Bar() {}

    public Bar(String barKey) {
         his.durations = new HashMap<String, Long>();
         this.integers = new HashMap<String, Integer>();

         durations.put(key, new Long(15));
         integers.put(key, new Integer(10));
    }

    ... setters and getters.....
}
@Entity
public class Foo extends SuperFoo {
    @Id
    private String id;

    public Foo() {}

    public Foo(String id, *superArguments*) {
        super(*superArguments*);
        this.id = id;
    }

    public String getId() { return id; }

    public void setId(String id) {
        this.id = id;
    }
}

@Entity
public class FooContainer {
    @Id
    String id;

    @OneToMany(cascade = CascadeType.ALL)
    List<Foo> fooList;

    public FooContainer() {}

    public FooContainer(String id) {
        this.id = id;
        this.fooList = new ArrayList<>();
    }

    public void addFoo(Foo foo) {
        this.fooList.add(foo);
    }

    public void setFooList(List<Foo> fooList) {this.fooList = fooList;}

    public List<Foo> getFooList() { return fooList; }
}

持续发生的方法:

public void method() {
    FooContainer fooContainer = fooContainerRepository.getOne(...);
    fooContainer.addFoo(new Foo(...));
    fooContainerRepository.save(fooContainer);
}

JPA创建以下表格(看起来很好):

  • FOO
  • foo_durations
  • foo_integers

现在,当我保存一个Foo实例时,一切都会被持久化(Foo中的字段)。 但是我没有在foo_durations和foo_integers中输入任何条目。此外,我没有例外。

我自己做了一点研究,发现了以下内容:
&#34;元素集合中包含的可嵌入类不得包含元素集合。&#34;

我想,在这里,情况并非如此,因为我的可嵌入课程&#34; Bar&#34;不包含在元素集合中。所以有人知道,我可能做错了什么? 提前谢谢!

更新
我忘了提到SuperFoo中的Bar对象不是通过构造函数设置的,而是在构造函数中计算的。

0 个答案:

没有答案