【问题标题】:Mapping two entities with one用一个映射两个实体
【发布时间】:2018-06-04 23:22:55
【问题描述】:

我有一个Contribution 实体

@Entity
public class ContributionEntity {

    private MovieEntity movie;

    private UserEntity user;
}

UserEntityMovieEntity 都有列表

private Set<ContributionEntity> contributions;

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

//贡献实体

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

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

//电影实体

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

//用户实体

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

但是这种方式有一个问题,因为我无法在UserEntityMovieEntity的列表中添加贡献,因为我会将同一个对象添加到数据库中两次。

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

【问题讨论】:

  • 我不明白上下文。最后一段代码属于哪个类?
  • 它没有直接关系,但是使用提供的数据创建贡献而不是将其两次添加到用户和电影中的列表中不是更好吗?我的意思是我认为贡献不应该没有用户或电影存在,但这可能会以你的方式发生。
  • @Matt:我编辑了问题。
  • 您可以删除关系的one-to-many 侧并将电影和用户视为元实体。这样做只会存在many-to-one 关系,您可以通过“findAllByMovie(Movie movie)”之类的方式获取电影的贡献列表(取决于您的持久层选择)

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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-18
    • 1970-01-01
    • 2011-08-10
    • 1970-01-01
    • 2018-03-14
    • 2022-01-23
    • 2015-10-03
    相关资源
    最近更新 更多