用一个映射两个实体

时间:2018-06-04 23:22:55

标签: java spring hibernate spring-mvc spring-boot

我有一个Contribution实体

@Entity
public class ContributionEntity {

    private MovieEntity movie;

    private UserEntity user;
}

UserEntityMovieEntity都有列表

private Set<ContributionEntity> contributions;

我正在寻找一种正确映射列表的方法,以便在添加贡献时,UserEntityMovieEntity在列表中有此贡献。我做了

// ContributionEntity

@ManyToOne
@JoinColumn(name = "movie_id")
private MovieEntity movie;

@ManyToOne
@JoinColumn(name = "user_id")
private UserEntity user;

// MovieEntity

@OneToMany(mappedBy = "movie", fetch = FetchType.LAZY)
private List<ContributionEntity> contributions = new ArrayList<>();

// UserEntity

@OneToMany(mappedBy = "user", fetch = FetchType.LAZY)
private List<ContributionEntity> contributions = new ArrayList<>();

但是,这样会出现问题,因为我无法在UserEntityMovieEntity中添加对列表的贡献,因为我会将相同的对象两次添加到数据库中。

在这种情况下哪种映射是正确的?

1 个答案:

答案 0 :(得分:0)

正如你所说,将Contribution添加到两个列表中是行不通的,因为Hibernate并不知道它是同一个对象。因此,您可以(非常繁琐)创建Contribution,设置相应的Movie并将其添加到User的贡献中。或者反过来,向新创建的User添加Contribution并将其添加到Movie的贡献列表中。请注意,您必须确保Contribution也被保留(例如@Cascade或手动保存)。

更好的方法是将重点放在Contribution上。如果您创建并保存Contribution,它将自动出现在两个列表中(但不会出现在当前事务中,但无论如何都可能不需要)。