【问题标题】:Hibernate OneToMany without a foreign key在没有外键的情况下休眠 OneToMany
【发布时间】:2011-07-08 19:17:38
【问题描述】:

有没有办法告诉 JPA 在创建表时不要在 OneToMany 关系上创建外键?这是我正在尝试做的一些示例代码:

我有两个名为 Project 和 Group 的实体。每个项目可以包含许多博客,每个组可以包含许多博客。但是,只有一个博客表可以存储所有博客。 Blog 表有一个名为 containerId 的列,其中包含父容器的 ID。例如,如果博客属于 ID 为 100 的组,则 blog 的 containerId 列的值为 100。

@OneToMany(fetch=FetchType.EAGER, mappedBy="containerId")
@Where(clause="containertype=600")
public Set<BlogEntity> getBlogs() {
    return blogs;
}

当我尝试使用有效的组 ID 将博客插入博客表时,我收到一个休眠错误,提示“违反完整性约束 - 没有父 FK84B5A4F0388ED18F 表:语句中的项目”。看起来 Project 和 Group 都试图在 blog 表的同一列 (containerId) 上创建外键。我该如何解决这个问题?

【问题讨论】:

    标签: hibernate


    【解决方案1】:

    首先,您不必使用 Hibernate 创建表。您可以使用自定义 SQL 脚本。

    现在,这样的数据库设计不是很干净,因为您不能对 container_id 列强制执行任何外键约束。

    我会在 blog 表中使用两列(group_id 和 project_id),或者使用两个连接表(group_blogs 和 project_blogs)。这会让 Hibernate 很高兴,并且会改进数据库。

    如果您担心此设计可能允许博客属于某个组和一个项目,请对博客表使用检查约束,确保 group_id 或 project_id 为空。但是,使用两个连接表更难。

    也就是说,如果你真的想保留那个设计,我认为关键是使用@Any 注释来映射反向关系(从博客到组/项目)。

    【讨论】:

      【解决方案2】:

      在我看来,在 Blag 表中拥有一列 ContainerID 是一种不好的方法。您最好创建两个不同的表以将 Blog 表连接到两个不同的表。您可以有一个 BlogProject 表和一个 BlogGroup 表。每个都将分别有一个 BlogID 和 ProjectID 或 GroupID。这些表格将是您关于博客映射到何处的指标。这与您在多对多关系中使用的方法相同。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-03-22
        • 2012-03-15
        • 1970-01-01
        • 2016-05-19
        • 2015-10-19
        • 2016-12-06
        • 1970-01-01
        • 2011-11-27
        相关资源
        最近更新 更多