NHibernate的主键是1-1映射吗?

Posted

技术标签:

【中文标题】NHibernate的主键是1-1映射吗?【英文标题】:NHibernate primary key is a 1-1 mapping? 【发布时间】:2011-03-06 13:36:51 【问题描述】:

也许我只是设计不正确,如果是这样,我很乐意以另一种方式退出并掠夺它......

我目前有 2 个这样的表,它们有一个共享主键:

人 - id (PK)、姓名、created_date、...

person_details - person_id (PK)、年龄、身高……

现在这个人被创建了,一个人只能有一组详细信息。所以最初我认为在映射 person_details 时,我会分配 PK,因为它是由人生成的。

现在我对如何在数据库中创建此数据的第一个实例有点困惑,因为当我创建一个包含 PersonDetails 模型实例的 Person 模型时,此时两者都不会有 Id,因为它们还没有被创建。那么如何告诉 PersonDetails 模型在创建时从 Parent Person 模型中获取其 Id 呢?

我是不是快疯了,或者我需要在 Person 模型中做一个简单的映射来告诉它在从自己的 Id 插入时推断 PersonDetails Id?如果在初始创建后进行更改,我最终需要 PersonDetails 上的 Person_Id,因为它们是由 Ajax 从外部更新到人员的...

【问题讨论】:

在考虑了更多之后,似乎一对一映射可能不是最好的方法,即使在数据库中它们是一对一映射......也是如此有更好的方法来构建它吗?最终我需要能够通过ajax独立更新细节(以及其他一些一对一的风格关系),所以他们需要有一些关系,所以我可以单独保存它们而不必保存整个人,除非这是唯一的这样做的方法... 【参考方案1】:

如果表共享一个 PK(我假设是亲自发起的),那么您要么有一个 one-to-one,其中一个人有一个详细信息,要么有一个 join,其中一个人有年龄、身高等并且它们被映射到不同的表中。

只需阅读这两章,它们都有示例。

【讨论】:

嗨,已经阅读了这些内容,但对我来说,问题是 Person 模型包含大量信息,如果我要拥有一个 PersonDetails 模型(和其他模型)的 Person,那么该模型具有对父 Person 的引用我将在回发中传递大量数据,因为我目前使用 MVC。这就是为什么我想要一个 PersonId 与模型中的 Person 相对的原因。我知道他们会延迟加载,所以它不像我实际上会有大量数据浮动,但我很确定 mvc 回发会有大量空数据......必须检查 问题是试图修改您的 Domain 模型以进行 HTTP 发布。而是创建一个 Presentation 模型。 我原本打算这样做并编写一个映射器来往复,但我认为如果我可以让 NHibernate 按我的意愿行事是没有意义的......

以上是关于NHibernate的主键是1-1映射吗?的主要内容,如果未能解决你的问题,请参考以下文章

父表的主键是子表的主键,如何使用jpa进行映射?

NHibernate 和字符串主键

外键是唯一的吗?

SQL 外键名称问题

NHibernate3剖析:Mapping篇之集合映射基础:List映射

mysql的主键是自动增长的,oracle的主键是起啥作用的