Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate多目标与超类映射问题_Java_Hibernate_Annotations - Fatal编程技术网

Java Hibernate多目标与超类映射问题

Java Hibernate多目标与超类映射问题,java,hibernate,annotations,Java,Hibernate,Annotations,我需要在Hibernate中创建一个关系,链接三个表:Survey、User和Group。 调查可以对用户或组可见,而组是由多个用户组成的 我的想法是为用户和组创建一个超类,并在该超类和调查之间创建多个关系 我的问题是,组不是映射到一个表,而是映射到一个视图,所以我不能将组的字段拆分到几个表中——如果我创建了一个公共超类,就会出现这种情况 我曾想过创建一个公共接口,但不允许映射到它们。 我可能最终会选择两种关系解决方案(调查用户和调查组),但我不太喜欢这种方法 我还想创建一个如下所示的表:

我需要在Hibernate中创建一个关系,链接三个表:Survey、User和Group。 调查可以对用户或组可见,而组是由多个用户组成的

我的想法是为用户和组创建一个超类,并在该超类和调查之间创建多个关系

我的问题是,组不是映射到一个表,而是映射到一个视图,所以我不能将组的字段拆分到几个表中——如果我创建了一个公共超类,就会出现这种情况

我曾想过创建一个公共接口,但不允许映射到它们。 我可能最终会选择两种关系解决方案(调查用户和调查组),但我不太喜欢这种方法

我还想创建一个如下所示的表:

  Survey Id  |  ElementId  | Type
ElementId将是组或用户ID,并且类型。。。它的类型。 有人知道如何使用hibernate注释实现它吗?还有其他想法吗


非常感谢

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

我还建议用户/组使用复合模式(这接近于您的第一个选项)


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

我还建议用户/组使用复合模式(这接近于您的第一个选项)


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

编辑:


第2.2.4.4节还列出了一些备选方案,涵盖了MappedSuperclass。

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

编辑:

第2.2.4.4节还列出了一些备选方案,涵盖了MappedSuperclass。

我昨天发布了一篇文章。总之,您不能使用映射的超类,因为映射的超类不是实体,也不能是关联的一部分(这正是您想要的),但您可以使用带有
表每类继承策略的抽象实体来获得类似的结果

类似于此(未经测试):

@实体
@继承(策略=继承类型。每个类的表)
公共抽象类AbstractEntity{
@Id@GeneratedValue(策略=GenerationType.TABLE)
私人长id;
@多个(mappedBy=“实体”)
私有集调查=新HashSet();
...
}
@实体
公共类用户扩展抽象实体{
...
}
@实体
公共类组扩展了抽象实体{
...
}
@实体
公营班级调查{
@Id@GeneratedValue
私人长id;
@许多
专用设备
  • 我昨天发布了一篇文章。总而言之,你不能使用映射的超类,因为映射的超类不是实体,也不能是关联的一部分(这是你想要的),但是你可以使用一个抽象实体和一个
    表/类继承策略来获得类似的结果

    类似于此(未经测试):

    @实体
    @继承(策略=继承类型。每个类的表)
    公共抽象类AbstractEntity{
    @Id@GeneratedValue(策略=GenerationType.TABLE)
    私人长id;
    @多个(mappedBy=“实体”)
    私有集调查=新HashSet();
    ...
    }
    @实体
    公共类用户扩展抽象实体{
    ...
    }
    @实体
    公共类组扩展了抽象实体{
    ...
    }
    @实体
    公营班级调查{
    @Id@GeneratedValue
    私人长id;
    @许多
    专用设备
    

  • 在我看来,这种方法似乎不起作用,因为您无法控制视图,两行(一行在组中,另一行在用户中)可能恰好具有相同的id,因此无法保证id的唯一性。使用这种方法,必须在多个表中共享id,而这在视图中是不可能的(它可能是从另一个模式中的表中获取的,您无法控制)。您如何将调查与元素联系起来???@Juan确实如此,但我希望在视图上可以进行连接(也许OP应该澄清这一点)。我会想一想。Juan Carlos是对的,我对视图完全没有控制权。还有一点我忘了提到:表已经填充了,所以如果我更改了模型,我将不得不创建并运行一些db脚本来更新数据,如果可能的话,我想避免它。因为它,我提到了调查Id|元素Id |类型方法。如果将鉴别器值(类型)添加到多个关系中,我的问题将得到解决。但是,在我看来,找不到一种方法来执行此操作,因为您无法控制视图,两行(一行在组中,另一行在用户中)可能恰好具有相同的id,因此无法保证id的唯一性。使用这种方法,id必须在多个表之间共享,而视图不可能这样做(它可能是从您无法控制的另一个架构中的表中获取).你会如何将调查与元素联系起来???@Juan确实如此,但我希望可以加入视图(也许OP应该澄清这一点)。我会想一想。Juan Carlos是对的,我对视图完全没有控制权。还有一点我忘了提到:表已经填充了,所以如果我更改了模型,我将不得不创建并运行一些db脚本来更新数据,如果可能的话,我想避免它。因为它,我提到了调查Id|元素Id |类型方法。如果将鉴别器值(类型)添加到多个关系中,我的问题将得到解决。但在我看来,找不到一种方法来解决它,因为你没有
    @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>();
    
        ...
    }