[英]JPA cascade persistence with entity ElementCollection keys
我有两个这样的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
字段在Bar
和Foo
之间形成了多对多关系,因此我认为使用@ManyToMany
为字段指定级联是合适的。 但是,当试图在地图中保留带有几个Foo → String
值的Bar
时,我得到以下异常:
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
以获得级联持久性工作?
您不需要@ManyToMany
注释。 ElementCollection
的操作总是级联的。
同时指定@ElementCollection
和@ManyToMany
是错误的。 这两个注释表示OR映射多于一个基数关系的不同概念。
ElementCollection
是一种严格的聚合或组合关系,其中集合中的元素由其父对象严格拥有,并且与元素的任何交互(如查询等)都必须通过父对象完成。 父集与集合中元素的多样性总是一对多。 元素实例可以在给定时间点仅与一个父元素相关。
ManyToMany
表示或多或少独立实体之间的关系,可以单独查询和操作,并且可以独立于声明使用@ManyToMany
注释的属性的实例进行查询和操作。 ManyToMany
关系意味着相关实例可以通过其他声明的关系与任意数量的其他实例相关联。
我希望任何符合标准的JPA实现都会显示错误或对这样注释的属性展示“未定义”行为。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.