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<>();