【问题标题】:Hibernate: multiple @ManyToMany relations in a single tableHibernate:单个表中的多个@ManyToMany 关系
【发布时间】:2017-08-30 02:44:51
【问题描述】:

我有一个项目使用 Hibernate 来管理实体。两个表之间可以存在多个 @ManyToMany 关系。所以基本上我有这样的代码:

@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinTable(name = "movies_screenplay_authors",
        joinColumns = @JoinColumn(name = "movie_id", nullable = false, updatable = false),
        inverseJoinColumns = @JoinColumn(name = "staff_id", nullable = false, updatable = false))
private Set<Staff> screenplayAuthors = Sets.newHashSet();

@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinTable(name = "movies_story_authors",
        joinColumns = @JoinColumn(name = "movie_id", nullable = false, updatable = false),
        inverseJoinColumns = @JoinColumn(name = "staff_id", nullable = false, updatable = false))
private Set<Staff> storyAuthors = Sets.newHashSet();

现在,我想将这些关系存储在一个表中,并附加一些描述关系类型的列。所以基本上,我想要这样的东西(使用伪代码):

@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinTable(name = "movies_staff",
        joinColumns = @JoinColumn(name = "movie_id", nullable = false, updatable = false),
        inverseJoinColumns = @JoinColumn(name = "staff_id", nullable = false, updatable = false),
        joinCriteria = @JoinCriteria(columnName = "staff_type", value = StaffType.SCREENPLAY_AUTHOR, enumType = EnumType.STRING))
private Set<Staff> screenplayAuthors = Sets.newHashSet();

@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinTable(name = "movies_staff",
        joinColumns = @JoinColumn(name = "movie_id", nullable = false, updatable = false),
        inverseJoinColumns = @JoinColumn(name = "staff_id", nullable = false, updatable = false),
        joinCriteria = @JoinCriteria(columnName = "staff_type", value = StaffType.STORY_AUTHOR, enumType = EnumType.STRING))
private Set<Staff> storyAuthors = Sets.newHashSet();

这是否可能,在 Hibernate 或 Java 世界的任何地方?

【问题讨论】:

  • 你的意思是一个单一的(共享的)连接表,就像在这个例子中 datanucleus.org/products/accessplatform_5_1/jpa/… 这超出了 JPA 的范围,但是 JPA 提供者(DataNucleus)做到了,不知道 Hibernate
  • 谢谢。这是一个有价值的链接。
  • 这些关系是否重叠?如果不是,一个更尴尬但可移植的解决方案是使用@ElementCollectionMap&lt;Staff, Role&gt;,其中角色是可能的关系角色的枚举(ScreenplayAuthorStoryAuthor 等)
  • 是的,关系经常重叠。

标签: java sql hibernate jpa


【解决方案1】:

您可以在每个 @JoinTable 注释之后添加如下内容:

@Fetch(FetchMode.SUBSELECT)

这就是全部。

【讨论】:

    猜你喜欢
    • 2018-01-21
    • 1970-01-01
    • 2014-08-31
    • 2015-10-24
    • 2017-07-18
    • 1970-01-01
    • 1970-01-01
    • 2011-03-15
    • 1970-01-01
    相关资源
    最近更新 更多