Hibernate ManyToMany和超类映射问题

时间:2010-05-27 16:41:47

标签: java hibernate annotations

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

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

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

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

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

  Survey Id  |  ElementId  | Type

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

非常感谢

3 个答案:

答案 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将复制每个子类的所有属性,这将与视图一起使用。

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

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

答案 2 :(得分:0)

这是可能的。可以通过将超类定义为MappedSuperclass来实现这种“继承属性”方法。

编辑:

section 2.2.4 in the hibernate annotations reference doc中还列出了一些替代方案,第2.2.4.4节介绍了MappedSuperclass。