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_CLASS
inheritance策略的抽象实体来获取类似的结果。
像这样的东西(未经测试):
@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将复制每个子类的所有属性,这将与视图一起使用。
我还建议用户/组的复合模式(接近你的第一个选项)。
这个有可能。 通过将超类定义为MappedSuperclass,可以实现这种“inheritance属性”方法。
编辑:
在hibernate注释参考文档的2.2.4节中也列出了一些替代方案,2.2.4.4节介绍了MappedSuperclass。