Java 将两个实体映射为一个实体

Java 将两个实体映射为一个实体,java,spring,hibernate,spring-mvc,spring-boot,Java,Spring,Hibernate,Spring Mvc,Spring Boot,我有一个贡献实体 @Entity public class ContributionEntity { private MovieEntity movie; private UserEntity user; } UserEntity和MovieEntity都有列表 private Set<ContributionEntity> contributions; //电影实体 @OneToMany(mappedBy = "movie", fetch = FetchTy

我有一个
贡献
实体

@Entity
public class ContributionEntity {

    private MovieEntity movie;

    private UserEntity user;
}
UserEntity
MovieEntity
都有列表

private Set<ContributionEntity> contributions;
//电影实体

@OneToMany(mappedBy = "movie", fetch = FetchType.LAZY)
private List<ContributionEntity> contributions = new ArrayList<>();
@OneToMany(mappedBy=“movie”,fetch=FetchType.LAZY)
私有列表贡献=新的ArrayList();
//用户实体

@OneToMany(mappedBy = "user", fetch = FetchType.LAZY)
private List<ContributionEntity> contributions = new ArrayList<>();
@OneToMany(mappedBy=“user”,fetch=FetchType.LAZY)
私有列表贡献=新的ArrayList();
但是,这种方式存在一个问题,因为我无法将贡献添加到
UserEntity
MovieEntity
中的列表中,因为我将向数据库添加同一对象两次


在这种情况下,什么映射是正确的?

正如您所说,将
贡献添加到两个列表中是行不通的,因为Hibernate不知道它是同一个对象。因此,您可以创建
贡献
,设置相应的
电影
,并将其添加到
用户的贡献中,这非常麻烦。或者反过来,将
用户
添加到新创建的
贡献
中,并将其添加到
电影
的贡献列表中。请注意,您必须确保
贡献也被持久化(例如通过
@Cascade
或手动保存)


更好的方法是将重点放在
贡献上。如果您创建并保存
贡献
,它将自动出现在两个列表中(虽然不在当前事务中,但这可能不是必需的)

我不明白上下文。最后一个代码部分中的代码属于哪个类?它不是直接相关的,但是使用提供的数据创建贡献,而不是将其添加到用户和电影中的列表中两次,这不是更好吗?我的意思是,我认为没有用户或电影,贡献不应该存在,但这可以以你的方式发生。@Matt:我编辑了这个问题。你可以删除关系的
一对多
端,将电影和用户视为元实体。通过这样做,只会存在
多对一
关系,您可以通过类似“findAllByMovie(电影电影)”的方式获取电影的贡献列表(取决于您的持久层选择)
@OneToMany(mappedBy = "user", fetch = FetchType.LAZY)
private List<ContributionEntity> contributions = new ArrayList<>();