【发布时间】: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