Java 具有单个映射表的多个关系,无需通过Hibernate生成外键

Java 具有单个映射表的多个关系,无需通过Hibernate生成外键,java,hibernate,many-to-many,one-to-one,many-to-one,Java,Hibernate,Many To Many,One To One,Many To One,我有两个基本抽象类,从这两个类派生出多个附加类,添加附加属性等 这些特定的派生类型之间存在关系 一个简单的示例: 角色和组类是抽象,但它们没有标记为@MappedSuperclass InheritanceType.JOINED策略正在使用,因此两个表Role(对于抽象类)和AdminRole(对于派生类)都应该存在(它们都将具有相同的RoleID) DiscussionGroup有一个AdminRole属性,一个 集合,一个集合 工作组有集合,集合 由于派生类的数量可能会增加,并且从角色派

我有两个基本抽象类,从这两个类派生出多个附加类,添加附加属性等

这些特定的派生类型之间存在关系

一个简单的示例:

角色
类是
抽象
,但它们没有标记为
@MappedSuperclass

InheritanceType.JOINED
策略正在使用,因此两个表
Role
(对于抽象类)和
AdminRole
(对于派生类)都应该存在(它们都将具有相同的
RoleID

  • DiscussionGroup
    有一个
    AdminRole
    属性,一个
    集合
    ,一个
    集合
  • 工作组
    集合
    集合
由于派生类的数量可能会增加,并且从角色派生的类可能与从组派生的不同类有关系(反之亦然),这将导致大量不同的映射表(Worker\u DiscussionGroup、Worker\u WorkingGroup)或多个外键列(在M:1关系中-例如,ManagerRole必须有DiscussionGroupID和WorkingGroupId)。我想通过一个公共映射表映射所有这些关系。

Role_Group (RoleID, GroupId)
在当前的开发过程中,我们使用Hibernate生成DDL模式(hbm2ddl.auto=create)(我们将使用静态模式定义供以后的生产使用)。Hibernate会自动为关系创建外键,这对我们来说非常好

如果我指示它使用相同的映射表进行连接(对于多对多、多对多以及一对一),它也会尝试创建外键。当然,在
RoleID
上从
Role\u Group
AdminRole
discussantore
同时创建外键是不可能的,所以我得到了一个错误

有没有办法,如何指导休眠

  • 生成不带外键的选定关系

  • 定义关系应基于抽象 祖先(即DiscussionGroup及其集合) 是否映射为1:N-组和集)?


  • 我认为应该保留多个表,它只是映射类中存在的关系


    如果您不希望这样,那么您可以在抽象
    组中定义
    ,在抽象
    角色中定义
    。您将不会有任何“子集”在子类中,您只需使用正确类型的适当元素填充抽象类中的集合。然后,自动映射将为您提供所需的单个联接表。

    以下是我对第2个问题的回答:

    @ForeignKey( name = "none" )
    
    没有为关系生成外键

    @Cascade( value = { CascadeType.ALL } )
    @OneToOne( fetch = FetchType.EAGER, orphanRemoval = true )
    @JoinTable( name = "Role_Group",
                inverseJoinColumns = { @JoinColumn( referencedColumnName = "rolleId", name = "RolleID" ) },
                joinColumns = { @JoinColumn( referencedColumnName = "groupId", name = "GroupID" ) } )
    
    @ForeignKey( name = "none" )
    public AdminRole getAdmin()
    
    资料来源:

    根据来源,这是一个未记录的特性,在发行说明中可以看到:

    Changes in version 2.1.9 (xx.x.xxxx)
    ------------------------------------
    * TimesTenDialect now supported (look at TimesTenDialect for certain limitations)
    * foreign-key="none" can be used to disable generation of a foreign key.
    
    在xml配置中-您可以这样使用它

    <many-to-one name="Hospital" column="hospitalId" property-ref="hospitalId" update="false" insert="false" foreign-key="none">
    
    
    
    如中所述(请参阅页面来源-页面上未显示xml配置)

    注意:

    但是,这并不能解决整个问题。Hibernate无法通过
    getAdmin
    getManagers
    的映射表获得正确的数据,因为它查找
    Role\u Group
    ,为
    DiscussionGroup
    GroupID
    找到
    RoleIDs
    ,并且不知道它是否为
    AdminRole
    ManagerRole
    并给出“不存在具有给定标识符的行”错误

    然而,类似的映射可以工作,当我在Group或DiscussionGroup中使用诸如
    public Set getRoles()
    这样的表时,Hibernate将成功地将派生类(
    AdminRole
    ManagerRole
    )加载到集合中

    <many-to-one name="Hospital" column="hospitalId" property-ref="hospitalId" update="false" insert="false" foreign-key="none">