Hibernate ManyToMany和超类映射问题

我需要在Hibernate中创建一个关系,链接三个表:Survey,User和Group。 用户或组可以看到调查,组是多个用户的forms。

我的想法是为User和Group创建一个超类,并在该超类和Survey之间创建一个ManyToMany关系。

我的问题是Group,不是映射到表,而是映射到视图,所以我不能在几个表中拆分Group的字段 – 如果我创建了一个公共超类,会发生这种情况。

我考虑过创建一个通用接口,但不允许映射到它们。 我可能最终会找到一个两个关系的解决方案(Survey-User和Survey-Group),但我不太喜欢这种方法。

我还想过创建一个看起来像这样的表:

Survey Id | ElementId | Type 

ElementId将是Group或UserId,类型是它的类型。 有谁知道如何使用hibernate注释实现它? 还有其他想法吗?

非常感谢

昨天我发布了一个非常相似的答案 。 总而言之,您不能使用映射的超类,因为映射的超类不是实体,也不能是关联的一部分(这是您想要的),但您可以使用带有TABLE_PER_CLASSinheritance策略的抽象实体来获取类似的结果。

像这样的东西(未经测试):

 @Entity @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) public abstract class AbstractEntity { @Id @GeneratedValue(strategy = GenerationType.TABLE) private Long id; @ManyToMany(mappedBy="entities") private Set surveys = new HashSet(); ... } @Entity public class User extends AbstractEntity { ... } @Entity public class Group extends AbstractEntity { ... } @Entity public class Survey { @Id @GeneratedValue private Long id; @ManyToMany private Set entities = new HashSet(); ... } 

参考

  • 注释,inheritance和接口
  • 使用MappedSuperclass关系一对多
  • 与MappedSuperclass的多态关联会引发exception

您可以使用每个具体类inheritance策略的表,hibernate将复制每个子类的所有属性,这将与视图一起使用。

我还建议用户/组的复合模式(接近你的第一个选项)。

http://en.wikipedia.org/wiki/Composite_pattern

这个有可能。 通过将超类定义为MappedSuperclass,可以实现这种“inheritance属性”方法。

编辑:

在hibernate注释参考文档的2.2.4节中也列出了一些替代方案,2.2.4.4节介绍了MappedSuperclass。