gpt4 book ai didi

java - Hibernate 在不生成外键的情况下与单个映射表的多个关系

转载 作者:行者123 更新时间:2023-11-29 03:54:10 31 4
gpt4 key购买 nike

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

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

一个简单的示例:

RoleGroup类是 abstract , 但它们未标记为 @MappedSuperclass .

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

  • DiscussionGroup有一个AdminRole属性(property),一个 Set<DiscussantRole> , 一个 Set<ManagerRole>
  • WorkingGroupSet<WorkerRole> , Set<ManagerRole>
Role 
|-- AdminRole
|-- DiscussantRole
|-- ManagerRole
|-- WorkerRole

Group
|-- DiscussionGroup
|-- WorkingGroup

因为派生类的数量会增长,并且因为从 Role 派生的类可以与从 Group 派生的不同类有关系(反之亦然),这将导致大量不同的映射表(Worker_DiscussionGroup、Worker_WorkingGroup)或多个外键列(在 M:1 关系中 - 例如,ManagerRole 必须具有 DiscussionGroupID 和 WorkingGroupId)。 我想通过一个通用映射表来映射所有这些关系。

Role_Group (RoleID, GroupId)

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

如果我指示它使用相同的映射表进行连接(对于多对多、多对多和一对一),它会尝试创建外部 key 也是如此。当然不可能在 RoleID 上创建外键来自 Role_GroupAdminRoleDiscussantRole同时,所以我得到一个错误。

有什么办法,如何指导Hibernate

  1. 生成没有外键的选定关系

  2. 定义关系应该基于抽象祖先(即 DiscussionGroup 及其 Set 应该映射为 1:N - Group and Set)?

最佳答案

以下对我来说是问题 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">

Let Hibernate Connect Your World! 中所述(查看页面源代码 - 页面上未显示 xml 配置)

注意:

但这并不能解决全部问题。 Hibernate 无法通过此映射表获取 getAdmin 的正确数据和 getManagers同样,因为它看起来是 Role_Group , 发现 RoleIDs对于 DiscussionGroup GroupID不知道它是否适用于 AdminRoleManagerRole并给出“不存在具有给定标识符的行”错误

但是,当我在组或讨论组中使用此类表作为 public Set<Role> getRoles() 时,类似的映射会起作用, Hibernate 将成功加载派生类 ( AdminRole , ManagerRole ) 到 Set。

关于java - Hibernate 在不生成外键的情况下与单个映射表的多个关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7313463/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com