10

我有两个这样的 JPA 实体:

@Entity
class Foo {
    @Id
    private long id;
    // ...
}

@Entity
class Bar {
    @ElementCollection(targetClass = String.class, fetch = FetchType.LAZY)
    @MapKeyJoinColumn(name = "foo_id", referencedColumnName = "id")
    @MapKeyClass(Foo.class)
    @Column(name = "content")
    @CollectionTable(name = "bar_foo_content",
                     joinColumns = @JoinColumn(name = "bar_id", referencedColumnName = "id"))
    @ManyToMany(cascade = CascadeType.ALL)
    private Map<Foo, String> fooContent = Maps.newHashMap();
    // ...
}

如您所见,该字段在和fooContent之间形成多对多关系,因此我认为使用该字段指定级联是合适的。但是,当尝试在地图中保留几个值时,我得到以下异常:BarFoo@ManyToManyBarFoo → String

javax.persistence.RollbackException: java.lang.IllegalStateException: During synchronization a new object was found through a relationship that was not marked cascade PERSIST: <<instance of Foo>>

显然,EclipseLink 不会级联我的Foo实例的持久性。我应该如何注释fooContent才能使级联持久化工作?

4

2 回答 2

11

这里不需要@ManyToMany注释。对ElementCollections 的操作总是级联的。

于 2013-10-22T12:10:46.443 回答
7

@ElementCollection同时指定两者是错误@ManyToMany的。这两个注释表示 OR 映射大于一的基数关系的不同概念。

ElementCollection是一种严格的聚合或组合关系,其中集合中的元素严格归其父对象所有,与元素的任何交互,如查询等,都必须通过父对象完成。父元素与集合中元素的多样性始终是一对多的。在给定的时间点,元素实例只能与一个父对象相关。

ManyToMany表示或多或少独立实体之间的关系,可以单独查询和操作,独立于声明用 注释的属性的实例@ManyToManyManyToMany关系意味着相关实例可以通过其他声明的关系与任意数量的其他实例相关联。

我希望任何符合标准的 JPA 实现都会显示错误或对像这样注释的属性表现出“未定义”行为。

于 2014-07-31T10:08:59.547 回答