我需要在Hibernate中创建一个关系,链接三个表:Survey,User和Group。 用户或组可以看到该调查,并且组是多个用户的形式。
我的想法是为User和Group创建一个超类,并在该超类和Survey之间创建一个ManyToMany关系。
我的问题是Group不是映射到表,而是映射到视图,所以我不能在几个表中拆分Group的字段 - 如果我创建了一个共同的超类,就会发生这种情况。
我考虑过创建一个通用接口,但不允许映射到它们。 我可能最终会选择两个关系解决方案(Survey-User和Survey-Group),但我不太喜欢这种方法。
我还想过创建一个看起来像的表:
Survey Id | ElementId | Type
ElementId是Group或UserId,类型是它的类型。 有谁知道如何使用hibernate注释实现它?还有其他想法吗?
非常感谢
答案 0 :(得分:1)
我昨天发布了非常similar answer。总而言之,您不能使用映射的超类,因为映射的超类不是实体,不能是关联的一部分(这是您想要的),但您可以使用具有TABLE_PER_CLASS
继承的抽象实体获得类似结果的策略。
像这样(未经测试):
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class AbstractEntity {
@Id @GeneratedValue(strategy = GenerationType.TABLE)
private Long id;
@ManyToMany(mappedBy="entities")
private Set<Survey> surveys = new HashSet<Survey>();
...
}
@Entity
public class User extends AbstractEntity {
...
}
@Entity
public class Group extends AbstractEntity {
...
}
@Entity
public class Survey {
@Id @GeneratedValue
private Long id;
@ManyToMany
private Set<AbstractEntity> entities = new HashSet<AbstractEntity>();
...
}
答案 1 :(得分:0)
您可以使用每个具体类继承策略的表,hibernate将复制每个子类的所有属性,这将与视图一起使用。
我还建议用户/组的复合模式(接近你的第一个选项)。
答案 2 :(得分:0)
这是可能的。可以通过将超类定义为MappedSuperclass来实现这种“继承属性”方法。
编辑:
section 2.2.4 in the hibernate annotations reference doc中还列出了一些替代方案,第2.2.4.4节介绍了MappedSuperclass。