没有外键的Hibernate OneToMany

时间:2011-07-08 19:17:38

标签: hibernate

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

我有两个名为Project and 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将博客插入博客表时,我收到一个hibernate错误,说“完整性约束违规 - 没有父FK84B5A4F0388ED18F表:PROJECT in statement”。看起来Project和Group都试图在博客表中的同一列(containerId)上创建外键。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

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

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

我要在博客表中使用两列(group_id和project_id),或者使用两个连接表(group_blogs和project_blogs)。这将使Hibernate满意,并将改进数据库。

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

也就是说,如果你真的想保留这种设计,我认为关键是使用@Any注释来映射反向关系(从Blog到Group / Project)。

答案 1 :(得分:0)

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