【问题标题】:JPA cascade persistence with entity ElementCollection keysJPA 级联持久性与实体 ElementCollection 键
【发布时间】:2013-10-26 00:56:38
【问题描述】:

我有两个这样的 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 以使级联持久化工作?

【问题讨论】:

  • 您的Foo 怎么样?该异常看起来Foo 和另一个实体之间存在问题。
  • @Uooo 错误仍然发生在上面的确切代码中(即 Foo 内没有更多字段)
  • 我遇到了同样的问题。你找到解决办法了吗?
  • @drame 不,我解决了这个问题。

标签: java jpa eclipselink


【解决方案1】:

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

【讨论】:

  • 即使没有@ManyToMany也会抛出异常
  • 至少 mysql 不是这种情况,fk 有级联限制
【解决方案2】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2018-05-15
    • 2012-06-17
    • 2015-11-02
    • 1970-01-01
    • 2011-11-23
    • 1970-01-01
    • 2018-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多