JPA级联持久化与实体ElementCollection键

dfl*_*str 8 java jpa eclipselink

我有两个这样的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();
    // ...
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,该fooContent字段在Bar和之间形成了多对多关系Foo,因此我认为使用@ManyToMany该字段指定级联是合适的.但是,当尝试在地图中保留一个Bar带有几个Foo ? 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>>
Run Code Online (Sandbox Code Playgroud)

显然,EclipseLink不会级联我的Foo实例的持久性.我应该如何注释fooContent以获得级联持续工作?

Uoo*_*ooo 7

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


Mir*_*emm 6

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

ElementCollection是一种严格的聚合或组合关系,其中集合中的元素由其父对象严格拥有,并且与元素的任何交互(如查询等)都必须通过父对象完成.父集与集合中元素的多样性总是一对多.元素实例可以在给定时间点仅与一个父元素相关.

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

我希望任何符合标准的JPA实现都会显示错误,或者为这样注释的属性显示"未定义"行为.