【问题标题】:JPA. Stackoverflow on cascade mergeJPA。 Stackoverflow 上的级联合并
【发布时间】:2015-09-22 22:16:13
【问题描述】:

这是我的 JPA 结构:

电影(查看级联类型):

@Entity
@Table(name = "movie")
public class Movie {

    @Id
    @Column(name = "movie_id")
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;

    //@OneToMany(cascade = CascadeType.ALL, mappedBy = "primaryKey.movie") //stack overflow
    @OneToMany(mappedBy = "primaryKey.movie") //works fine
    private List<Rating> ratings;
    ....
}

评分:

@Entity
@Table(name = "rating")
@AssociationOverrides({@AssociationOverride(name = "primaryKey.movie", joinColumns = @JoinColumn(name = "movie_id")),
        @AssociationOverride(name = "primaryKey.user", joinColumns = @JoinColumn(name = "imdb_user_id"))})
public class Rating {
    @EmbeddedId
    private RatingId primaryKey = new RatingId();

    @Column(name = "rating_value")
    private Integer ratingValue;
    .....
}

评级 ID:

@Embeddable
public class RatingId implements Serializable{
    @ManyToOne
    private Movie movie;

    @ManyToOne
    private User user;
}

当我用CascadeType.ALL 调用entityManager.merge(Movie movie) 时,我得到了 StackOverflowError。如果删除级联,合并调用不会引发错误。哪里可能有问题?

我认为这个问题与复合主键有关。 merge 对其他具有相同一对多关系但没有复合 id 的实体执行时不会出错。

【问题讨论】:

  • 如果有人愿意,我可以提供堆栈跟踪。
  • 提供堆栈跟踪通常是个好主意。
  • 您能否向我们展示您触发此错误的 JPA 代码? (创建您的实体 + EntityManager api 使用)
  • @AlexandreJacob 我实际上通过在正确的位置添加FetchType.LAZY 解决了这个问题。稍后我会写答案。
  • 小心:更改加载策略可能不是解决问题的最佳方法

标签: java hibernate jpa stack-overflow cascade


【解决方案1】:

StackOverflow 是由循环关系引起的。为了避免异常,我将多对多表中的键标记为@ManyToOne(fetch = FetchType.LAZY)

这就是我的表格在修改后的样子:https://stackoverflow.com/a/32544519/2089491

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-24
    • 1970-01-01
    • 2012-06-17
    • 2012-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多